HeadlinesBriefing favicon HeadlinesBriefing.com

使用 PyO3 在 Python 中运行 Rust JSON 解析器

Hacker News •
×

每当你使用 Pydantic v2 验证数据时——这是大多数 Python 应用程序首选的数据验证库——其底层都是由 Rust 扩展完成工作的。其核心 pydantic-core 正是使用 PyO3 构建的,这也是本文用来将一个小型 Rust JSON 解析器作为 Python 包暴露的工具链。

将 Rust 代码集成到 Python 中需要四个步骤:编写一个普通的 Rust 模块,使用 PyO3 宏进行标注,让 maturin 编译并安装它,最后导入结果。#[pyfunction] 和 #[pymodule] 添加了胶水代码、类型转换和引用计数。然后 Maturin 将 crate 编译为共享库并将其放入你的虚拟环境中。

该解析器生成一个普通的 Rust 枚举:Null、Boolean(bool)、Number(f64)、String(String)、Array(Vec<Json Value>) 或 Object(Hash Map<String, Json Value>)。一个 Rust 属性宏会重写它所在的函数,类似于 Python 装饰器。在我们的 Python 转 Rust 班级中,学生花费六周时间从头用 Rust 编写 JSON 解析器,包括手写的分词器和递归下降解析器,不使用 serde,然后通过 PyO3 将其暴露给 Python。Josh 的版本在真实世界的测试数据上击败了 CPython 的 C json 模块;Jochen 的版本比 Python 版本快达 3.5 倍。

公开的参考实现是学生开始学习的简洁版本。parse_json<'py>(py: Python<'py>, input: &str) -> Py Result<Bound<'py, Py Any>> 返回值或引发 Python 异常。在传统的 Python 构建中,这种访问与持有 GIL 相关。PyO3 将其交给你,你需要在接触 Python 对象的任何地方传递它。

关键实体:人物:Josh、Jochen