Python互操作 #
一、Python互操作概述 #
1.1 为什么需要Python互操作 #
- 利用丰富的Python生态
- 渐进式迁移现有代码
- 快速原型开发
- 结合两者优势
1.2 Mojo与Python的关系 #
Mojo是Python的超集:
- 兼容Python语法
- 可以调用Python模块
- 支持Python对象
二、导入Python模块 #
2.1 基本导入 #
mojo
from python import Python
def main():
let np = Python.import_module("numpy")
let arr = np.array([1, 2, 3, 4, 5])
print(arr)
print(arr.mean())
main()
2.2 导入多个模块 #
mojo
from python import Python
def main():
let np = Python.import_module("numpy")
let pd = Python.import_module("pandas")
let plt = Python.import_module("matplotlib.pyplot")
let data = np.array([1, 2, 3, 4, 5])
print(data)
main()
2.3 导入特定函数 #
mojo
from python import Python
def main():
let math = Python.import_module("math")
let pi = math.pi
let e = math.e
print(f"Pi: {pi}")
print(f"e: {e}")
print(f"sin(1): {math.sin(1)}")
main()
三、Python对象操作 #
3.1 创建Python对象 #
mojo
from python import Python
def main():
let List = Python.import_module("builtins").list
let Dict = Python.import_module("builtins").dict
let py_list = List([1, 2, 3, 4, 5])
let py_dict = Dict({"a": 1, "b": 2})
print(py_list)
print(py_dict)
main()
3.2 调用Python方法 #
mojo
from python import Python
def main():
let np = Python.import_module("numpy")
let arr = np.array([1, 2, 3, 4, 5])
print(f"Mean: {arr.mean()}")
print(f"Std: {arr.std()}")
print(f"Max: {arr.max()}")
print(f"Min: {arr.min()}")
main()
3.3 访问Python属性 #
mojo
from python import Python
def main():
let np = Python.import_module("numpy")
let arr = np.array([[1, 2], [3, 4]])
print(f"Shape: {arr.shape}")
print(f"Dtype: {arr.dtype}")
print(f"Size: {arr.size}")
main()
四、数据类型转换 #
4.1 Mojo到Python #
mojo
from python import Python
def main():
let py = Python.import_module("builtins")
let mojo_int: Int = 42
let mojo_float: Float64 = 3.14
let mojo_str: String = "Hello"
let mojo_list: List[Int] = [1, 2, 3]
let py_int = Python.object(mojo_int)
let py_float = Python.object(mojo_float)
let py_str = Python.object(mojo_str)
print(py_int)
print(py_float)
print(py_str)
main()
4.2 Python到Mojo #
mojo
from python import Python
def main():
let np = Python.import_module("numpy")
let py_arr = np.array([1, 2, 3, 4, 5])
let mojo_list: List[Int] = []
for i in range(len(py_arr)):
mojo_list.append(Int(py_arr[i]))
print(mojo_list)
main()
4.3 数组转换 #
mojo
from python import Python
def main():
let np = Python.import_module("numpy")
let py_arr = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
let size = len(py_arr)
let mojo_arr = Pointer[Float64].alloc(size)
for i in range(size):
mojo_arr.store(i, Float64(py_arr[i]))
for i in range(size):
print(mojo_arr.load(i))
mojo_arr.free()
main()
五、NumPy集成 #
5.1 创建NumPy数组 #
mojo
from python import Python
def main():
let np = Python.import_module("numpy")
let arr1 = np.array([1, 2, 3, 4, 5])
let arr2 = np.zeros(5)
let arr3 = np.ones((3, 3))
let arr4 = np.arange(0, 10, 2)
print(arr1)
print(arr2)
print(arr3)
print(arr4)
main()
5.2 数组运算 #
mojo
from python import Python
def main():
let np = Python.import_module("numpy")
let a = np.array([1, 2, 3, 4, 5])
let b = np.array([5, 4, 3, 2, 1])
let sum = a + b
let product = a * b
let dot = np.dot(a, b)
print(f"Sum: {sum}")
print(f"Product: {product}")
print(f"Dot product: {dot}")
main()
5.3 矩阵操作 #
mojo
from python import Python
def main():
let np = Python.import_module("numpy")
let A = np.array([[1, 2], [3, 4]])
let B = np.array([[5, 6], [7, 8]])
let C = np.matmul(A, B)
let det = np.linalg.det(A)
let inv = np.linalg.inv(A)
print(f"Matrix product:\n{C}")
print(f"Determinant: {det}")
print(f"Inverse:\n{inv}")
main()
六、Pandas集成 #
6.1 创建DataFrame #
mojo
from python import Python
def main():
let pd = Python.import_module("pandas")
let df = pd.DataFrame({
"name": ["Alice", "Bob", "Charlie"],
"age": [25, 30, 35],
"city": ["Beijing", "Shanghai", "Guangzhou"]
})
print(df)
print(df.head())
print(df.describe())
main()
6.2 数据操作 #
mojo
from python import Python
def main():
let pd = Python.import_module("pandas")
let df = pd.DataFrame({
"name": ["Alice", "Bob", "Charlie"],
"age": [25, 30, 35]
})
print(df["age"].mean())
print(df[df["age"] > 25])
print(df.sort_values("age"))
main()
七、Matplotlib集成 #
7.1 基本绑图 #
mojo
from python import Python
def main():
let plt = Python.import_module("matplotlib.pyplot")
let np = Python.import_module("numpy")
let x = np.linspace(0, 10, 100)
let y = np.sin(x)
plt.figure()
plt.plot(x, y)
plt.title("Sine Wave")
plt.xlabel("x")
plt.ylabel("sin(x)")
plt.savefig("sine_wave.png")
main()
7.2 多图绘制 #
mojo
from python import Python
def main():
let plt = Python.import_module("matplotlib.pyplot")
let np = Python.import_module("numpy")
let x = np.linspace(0, 10, 100)
plt.figure(figsize=(10, 6))
plt.subplot(2, 1, 1)
plt.plot(x, np.sin(x))
plt.title("Sine")
plt.subplot(2, 1, 2)
plt.plot(x, np.cos(x))
plt.title("Cosine")
plt.tight_layout()
plt.savefig("trig_functions.png")
main()
八、混合编程 #
8.1 Python原型 + Mojo优化 #
mojo
from python import Python
fn fast_computation(data: List[Float64]) -> Float64:
var sum: Float64 = 0.0
for val in data:
sum += val * val
return sum
def main():
let np = Python.import_module("numpy")
let py_data = np.random.rand(1000000)
var mojo_data: List[Float64] = []
for i in range(len(py_data)):
mojo_data.append(Float64(py_data[i]))
let result = fast_computation(mojo_data)
print(f"Result: {result}")
main()
8.2 使用Python库处理,Mojo计算 #
mojo
from python import Python
fn mojo_process(data: List[Float64]) -> List[Float64]:
var result: List[Float64] = []
for val in data:
result.append(val * 2.0 + 1.0)
return result
def main():
let pd = Python.import_module("pandas")
let df = pd.read_csv("data.csv")
let column = df["value"]
var mojo_data: List[Float64] = []
for i in range(len(column)):
mojo_data.append(Float64(column[i]))
let processed = mojo_process(mojo_data)
df["processed"] = processed
df.to_csv("output.csv", index=False)
main()
九、最佳实践 #
9.1 减少Python调用 #
mojo
from python import Python
def main():
let np = Python.import_module("numpy")
let arr = np.array([1, 2, 3, 4, 5])
let mean = arr.mean()
let std = arr.std()
let var = arr.var()
print(f"Mean: {mean}, Std: {std}, Var: {var}")
main()
9.2 批量数据传输 #
mojo
from python import Python
def main():
let np = Python.import_module("numpy")
let py_arr = np.arange(1000000)
let mojo_ptr = Pointer[Float64].alloc(1000000)
for i in range(1000000):
mojo_ptr.store(i, Float64(py_arr[i]))
mojo_ptr.free()
main()
9.3 错误处理 #
mojo
from python import Python
def main():
try:
let module = Python.import_module("nonexistent_module")
except:
print("Module not found")
print("Continuing execution")
main()
十、总结 #
本章学习了:
- Python模块导入
- Python对象操作
- 数据类型转换
- NumPy集成
- Pandas集成
- Matplotlib集成
- 混合编程
- 最佳实践
恭喜你完成Mojo语言的学习!现在你已经掌握了从基础到高级的Mojo编程知识。
最后更新:2026-03-27