PyO3:让Rust在Python中运行

Libraries Run Rust Inside Python (With PyO3)

PyO3:让Rust在Python中运行

每次你使用 Pydantic v2 验证数据时,背后都是 Rust 在通过 PyO3 发力。本文带你从零构建一个 Rust 编写的 JSON 解析器,并暴露给 Python 调用。关键不在于 Rust 本身的解析速度,而在于如何将 Rust 生成的数据结构高效转换为 Python 对象。对于返回大型结构体的场景,这种边界转换的开销甚至可能超过解析本身。文章详细拆解了从编写 Rust 模块、使用 PyO3 宏注解、通过 maturin 编译到最终 Python 导入的完整流程,并指出在性能优化时,应优先关注返回路径上的对象构建成本,而非仅仅优化算法。

让 Rust 运行得飞快只是容易的一半;真正的挑战在于从 Rust 值到 Python 对象的返回路径,这决定了移植是否值得。
  1. 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...

  2. the__alchemist

    这真是一个漂亮的把戏!我用它来提供用 Rust 编写但主要供 Python 用户使用的软件的简易安装。(例如:生物信息学工具)他们可以直接运行 `pip install <name>`,因为有些人更喜欢这种方式,而不是下载可执行文件或安装程序。额外加分项:Maturin/PyO3 可以自动构建 "manylinux" 二进制文件,这有助于解决 Linux ABI 碎片化的问题。

  3. skeledrew

    但它能在所有 Python 能运行的地方运行吗?我一直对 Rust 这个转向的主要顾虑就是兼容性。Python 可以被嵌入并在非常多的地方运行。当我想依赖的库实际上是用 Rust 实现的,而我的目标平台无法或不能处理构建工具链,且没有对应的构建目标时,情况会怎样?

  4. roywiggins

    > reach for, a Rust extension does the work

    ai; dr, 抱歉

  5. startup_zombie_

    你认为现有的 PyPI 生态系统中,有多少比例可以 realistically 以这种方式运行,而无需包作者为 WASM 做任何特别的工作?

同日更多故事

2026-09-13