PyO3:让Rust在Python中运行
Libraries Run Rust Inside Python (With PyO3)

每次你使用 Pydantic v2 验证数据时,背后都是 Rust 在通过 PyO3 发力。本文带你从零构建一个 Rust 编写的 JSON 解析器,并暴露给 Python 调用。关键不在于 Rust 本身的解析速度,而在于如何将 Rust 生成的数据结构高效转换为 Python 对象。对于返回大型结构体的场景,这种边界转换的开销甚至可能超过解析本身。文章详细拆解了从编写 Rust 模块、使用 PyO3 宏注解、通过 maturin 编译到最终 Python 导入的完整流程,并指出在性能优化时,应优先关注返回路径上的对象构建成本,而非仅仅优化算法。
让 Rust 运行得飞快只是容易的一半;真正的挑战在于从 Rust 值到 Python 对象的返回路径,这决定了移植是否值得。
HN 评论区
40- simonw
当这个趋势刚开始兴起时,我有点担心,因为我关心 Pyodide(通过 WebAssembly 运行的 Python),而使用 PyO3 的库可能无法在 Pyodide 中运行。
幸运的是,这个问题现在基本解决了——你现在可以在 PyPI 上编译并发布 Rust 或 C 扩展的 WASM 版本,然后 Pyodide 就可以使用它们。
例如,这里就是包含 Rust 的 Pydantic-core 包的 WASM 构建版本:https://pypi.org/project/pydantic_core/#pydantic_core-2.49.0...
- the__alchemist
这真是一个漂亮的把戏!我用它来提供用 Rust 编写但主要供 Python 用户使用的软件的简易安装。(例如:生物信息学工具)他们可以直接运行 `pip install <name>`,因为有些人更喜欢这种方式,而不是下载可执行文件或安装程序。额外加分项:Maturin/PyO3 可以自动构建 "manylinux" 二进制文件,这有助于解决 Linux ABI 碎片化的问题。
- skeledrew
但它能在所有 Python 能运行的地方运行吗?我一直对 Rust 这个转向的主要顾虑就是兼容性。Python 可以被嵌入并在非常多的地方运行。当我想依赖的库实际上是用 Rust 实现的,而我的目标平台无法或不能处理构建工具链,且没有对应的构建目标时,情况会怎样?
- roywiggins
> reach for, a Rust extension does the work
ai; dr, 抱歉
- startup_zombie_
你认为现有的 PyPI 生态系统中,有多少比例可以 realistically 以这种方式运行,而无需包作者为 WASM 做任何特别的工作?