HeadlinesBriefing favicon HeadlinesBriefing.com

Menjalankan Parser JSON Rust di Python dengan PyO3

Hacker News •
×

Setiap kali Anda memvalidasi data dengan Pydantic v2, library validasi data yang paling banyak dijangkau oleh aplikasi Python, ekstensi Rust yang melakukan pekerjaannya. Inti-nya, pydantic-core, dibangun dengan PyO3, toolchain yang sama yang digunakan posting ini untuk mengekspos parser JSON Rust kecil sebagai paket Python.

Membawa kode Rust ke Python memerlukan empat langkah: menulis modul Rust normal, menganotasikannya dengan makro PyO3, membiarkan maturin mengompilasikan dan menginstalnya, dan mengimpor hasilnya. #[pyfunction] dan #[pymodule] menambahkan glue, konversi tipe, dan reference counting. Maturin kemudian mengompilasi crate ke shared library dan menempatkannya di virtual environment Anda.

Parser menghasilkan enum Rust biasa: Null, Boolean(bool), Number(f64), String(String), Array(Vec<Json Value>), atau Object(Hash Map<String, Json Value>). Sebuah attribute macro Rust menulis ulang fungsi di mana ia berada, seperti decorator Python. Di kohort Python ke Rust kami, siswa menghabiskan enam minggu menulis parser JSON dari nol di Rust, tokenizer buatan tangan dan recursive-descent parser tanpa serde, lalu mengeksposnya ke Python melalui PyO3. Versi Josh mengalahkan modul C json CPython pada fixture dunia nyata; versi Jochen berjalan hingga 3.5x lebih cepat dari versi Python.

Implementasi referensi publik adalah versi bersih yang menjadi titik awal siswa. parse_json<'py>(py: Python<'py>, input: &str) -> Py Result<Bound<'py, Py Any>> mengembalikan nilai atau memunculkan exception Python. Pada build Python tradisional, akses ini terkait dengan memegang GIL. PyO3 menyerahkannya ke Anda dan Anda meneruskannya ke mana pun Anda menyentuh objek Python.

Entitas Kunci: Orang: Josh, Jochen