HeadlinesBriefing favicon HeadlinesBriefing.com

Rust JSON-Parser in Python mit PyO3 ausführen

Hacker News •
×

Jedes Mal, wenn Sie Daten mit Pydantic v2 validieren – der Datenvalidierungsbibliothek, die die meisten Python-Apps verwenden – erledigt eine Rust-Erweiterung die Arbeit. Ihr Kern, pydantic-core, ist mit PyO3 gebaut, demselben Toolchain, den dieser Beitrag verwendet, um einen kleinen Rust-JSON-Parser als Python-Paket bereitzustellen.

Rust-Code in Python zu bringen, erfordert vier Schritte: ein normales Rust-Modul schreiben, es mit PyO3-Makros annotieren, maturin kompilieren und installieren lassen und das Ergebnis importieren. #[pyfunction] und #[pymodule] fügen den Klebstoff, Typkonvertierungen und Referenzzählung hinzu. Maturin kompiliert den Crate dann zu einer Shared Library und legt sie in Ihre virtuelle Umgebung ab.

Der Parser erzeugt ein einfaches Rust-Enum: Null, Boolean(bool), Number(f64), String(String), Array(Vec<Json Value>) oder Object(Hash Map<String, Json Value>). Ein Rust-Attribut-Makro schreibt die Funktion um, auf der es sitzt, wie ein Python-Dekorator. In unserem Python-zu-Rust-Kurs verbringen Studierende sechs Wochen damit, einen JSON-Parser von Grund auf in Rust zu schreiben – einen handgeschriebenen Tokenizer und rekursiven Abstieg-Parser ohne serde – und stellen ihn dann über PyO3 Python bereit. Joshs Version schlug CPythons C-json-Modul bei realen Fixtures; Jochens Version lief bis zu 3,5x schneller als die Python-Version.

Die öffentliche Referenzimplementierung ist die saubere Version, mit der die Studierenden beginnen. parse_json<'py>(py: Python<'py>, input: &str) -> Py Result<Bound<'py, Py Any>> gibt den Wert zurück oder wirft eine Python-Exception. Bei traditionellen Python-Builds ist dieser Zugriff mit dem Halten des GIL verbunden. PyO3 reicht ihn an Sie weiter, und Sie reichen ihn weiter, wo immer Sie ein Python-Objekt berühren.

Schlüsselentitäten: Personen: Josh, Jochen