得益于Rust优越的语言特性, 比如内存安全、不需要运行时内存垃圾回收、以及节省内存和卓越的性能,最近 “Rust Everythig”(用Rust重写一切!)的趋势越来越明显。但Rust本身也有一个“硬伤”,那就是学习曲线特别陡。而相对于python,python的特别容易上手,但性能却远远落后于Java/Go/C++/Rust等语言。能不能用python来写程序(面向用户),把执行引擎交给Rust(面向机器)?
答案当然是:Yes! PyO3。
PyO3是一个Rust和Python之间的桥梁,允许用Rust编写程序,并打包成wheel包供python程序安装使用。也支持从Rust二进制文件中调用python程序。本文先介绍如何用rust编写python模块。
环境准备
假设你已经成功安装了uv和Rust:
推荐使用Zed IDE进行开发。
初始化工程
新建一个目录:stringsum, 然后进入stringsum,运行uv venv 创建一个python虚拟环境。
然后运行:uv pip install maturin。激活创建的虚拟环境:.\.venv\Scripts\active,并使用maturin初始化一个工程:maturin init
可以看到Cargo.toml的内容如下:
[package]name = "stringsum"version = "0.1.0"edition = "2024"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[lib]name = "stringsum"crate-type = ["cdylib"][dependencies]pyo3 = "0.28.2"
lib.rs内容如下:
use pyo3::prelude::*;/// A Python module implemented in Rust.#[pymodule]mod stringsum { use pyo3::prelude::*; /// Formats the sum of two numbers as string. #[pyfunction] fn sum_as_string(a: usize, b: usize) -> PyResult<String> { Ok((a + b).to_string()) }}
将stringsum模块安装到当前的python虚拟环境中: maturin develop。
如果要打包成wheel包,在另外一个工程安装:maturin build --release构建出wheel包。然后在另外的工程安装: pip install target\wheels\stringsum-xxx.whl就可以使用了。
在python中调用:
Python 3.13.11 (main, Dec 9 2025, 19:02:08) [MSC v.1944 64 bit (AMD64)] on win32Type "help", "copyright", "credits" or "license" for more information.>>> from stringsum import sum_as_string>>> sum_as_string(50,55)'105'>>>
总结
PyO3让你可以享受python写程序的愉悦,同时拥有Rust的执行性能。可谓一举两得。目前社区已经有了很多这样的库,比如Polars -- Pandas的Rust替代,让原有基于Pandas的程序直接提升N倍的性能,但基本不需要修改代码。对于Python生态,相信会有越来越多的程序核心部分会被Rust+PyO3编写的模块替代。