HeadlinesBriefing favicon HeadlinesBriefing.com

Запуск парсеров JSON на Rust в Python с помощью PyO3

Hacker News •
×

Каждый раз, когда вы валидируете данные с помощью Pydantic v2 — библиотеки валидации данных, которую используют большинство Python-приложений — работу выполняет расширение на Rust. Его ядро, pydantic-core, построено с помощью PyO3, того же инструментария, который используется в этой статье для предоставления небольшого парсера JSON на Rust как пакета Python.

Интеграция кода Rust в Python занимает четыре шага: написать обычный модуль Rust, аннотировать его макросами PyO3, позволить maturin скомпилировать и установить его, и импортировать результат. #[pyfunction] и #[pymodule] добавляют связующий код, преобразования типов и подсчёт ссылок. Затем Maturin компилирует крейт в общую библиотеку и помещает её в ваше виртуальное окружение.

Парсер создаёт простое перечисление Rust: Null, Boolean(bool), Number(f64), String(String), Array(Vec<Json Value>) или Object(Hash Map<String, Json Value>). Атрибутный макрос Rust переписывает функцию, над которой он стоит, как декоратор Python. В нашей когорте «Python в Rust» студенты тратят шесть недель на написание парсера JSON с нуля на Rust — ручной токенизатор и рекурсивный нисходящий парсер без serde — а затем предоставляют его в Python через PyO3. Версия Josh обогнала модуль C json CPython на реальных тестах; версия Jochen работала до 3,5 раза быстрее версии на Python.

Публичная эталонная реализация — это чистая версия, с которой начинают студенты. parse_json<'py>(py: Python<'py>, input: &str) -> Py Result<Bound<'py, Py Any>> возвращает значение или вызывает исключение Python. В традиционных сборках Python этот доступ связан с удержанием GIL. PyO3 передаёт его вам, и вы передаёте его дальше везде, где касаетесь объекта Python.

Ключевые сущности: Люди: Josh, Jochen