HeadlinesBriefing favicon HeadlinesBriefing.com

Ejecutar analizadores JSON de Rust en Python con PyO3

Hacker News •
×

Cada vez que validas datos con Pydantic v2, la biblioteca de validación de datos que la mayoría de las aplicaciones Python utilizan, una extensión de Rust realiza el trabajo. Su núcleo, pydantic-core, está construido con PyO3, la misma cadena de herramientas que este artículo usa para exponer un pequeño analizador JSON de Rust como un paquete de Python.

Llevar código de Rust a Python requiere cuatro pasos: escribir un módulo normal de Rust, anotarlo con macros de PyO3, dejar que maturin lo compile e instale, e importar el resultado. #[pyfunction] y #[pymodule] añaden el pegamento, conversiones de tipos y conteo de referencias. Luego Maturin compila el crate a una biblioteca compartida y la coloca en tu entorno virtual.

El analizador produce un enum simple de Rust: Null, Boolean(bool), Number(f64), String(String), Array(Vec<Json Value>) u Object(Hash Map<String, Json Value>). Un macro de atributo de Rust reescribe la función sobre la que se sienta, como un decorador de Python. En nuestra cohorte de Python a Rust, los estudiantes pasan seis semanas escribiendo un analizador JSON desde cero en Rust, un tokenizador hecho a mano y un analizador descendente recursivo sin serde, y luego lo exponen a Python a través de PyO3. La versión de Josh superó al módulo C json de CPython en pruebas reales; la de Jochen llegó a ser 3.5x más rápida que la versión de Python.

La implementación de referencia pública es la versión limpia desde la que parten los estudiantes. parse_json<'py>(py: Python<'py>, input: &str) -> Py Result<Bound<'py, Py Any>> devuelve el valor o lanza una excepción de Python. En compilaciones tradicionales de Python, este acceso está asociado a mantener el GIL. PyO3 te lo entrega y tú lo pasas dondequiera que toques un objeto de Python.

Entidades clave: Personas: Josh, Jochen