Bob Belderbos:如何在 Python 中运行 Rust(借助 PyO3)
Pydantic v2 的数据验证依赖于 Rust 扩展 pydantic-core,该扩展使用 PyO3 构建。本文演示如何在 Rust 中创建自定义 JSON 解析器并将其暴露给 Python。该过程包括编写 Rust 模块,用 PyO3 宏注释,并使用 maturin 编译和安装。示例的核心是一个表示 JSON 树结构的 Rust 枚举。向 Python 开放函数需要特定的 PyO3 注释和类型,如 Python 和 Bound。最重要的方面是将 Rust 数据结构转换回 Python 对象。这一“返回过程”涉及创建大量 Python 对象,这可能比解析大型 JSON 文档的成本更高。该转换通过实现 IntoPyObject 特性来完成。错误还需要转换;Rust 错误通过 From 特性转换为 Python 异常。对于标量返回值,跨越边界的成本可以忽略不计。然而,对于大型结构,转换成本较大,可能主导性能。优化边界转换,可能通过返回懒惰视图,对于成功从 Rust 移植到 Python 至关重要。因此,分析 Rust 与 Python 之间的边界至关重要。