HeadlinesBriefing favicon HeadlinesBriefing.com

Executando analisadores JSON Rust em Python com PyO3

Hacker News •
×

Toda vez que você valida dados com Pydantic v2, a biblioteca de validação de dados que a maioria dos apps Python usa, uma extensão Rust faz o trabalho. Seu núcleo, pydantic-core, é construído com PyO3, a mesma toolchain que este post usa para expor um pequeno analisador JSON Rust como pacote Python.

Levar código Rust para Python leva quatro passos: escrever um módulo Rust normal, anotá-lo com macros PyO3, deixar o maturin compilar e instalar, e importar o resultado. #[pyfunction] e #[pymodule] adicionam a cola, conversões de tipo e contagem de referências. O Maturin então compila o crate para uma biblioteca compartilhada e o coloca no seu ambiente virtual.

O analisador produz um enum Rust simples: Null, Boolean(bool), Number(f64), String(String), Array(Vec<Json Value>) ou Object(Hash Map<String, Json Value>). Um macro de atributo Rust reescreve a função em que está, como um decorador Python. Na nossa coorte Python para Rust, alunos gastam seis semanas escrevendo um analisador JSON do zero em Rust, um tokenizador artesanal e analisador recursivo descendente sem serde, então o expõem ao Python via PyO3. A versão do Josh venceu o módulo C json do CPython em fixtures reais; a do Jochen rodou até 3.5x mais rápido que a versão Python.

A implementação de referência pública é a versão limpa a partir da qual os alunos começam. parse_json<'py>(py: Python<'py>, input: &str) -> Py Result<Bound<'py, Py Any>> retorna o valor ou levanta uma exceção Python. Em builds tradicionais do Python, este acesso está associado a segurar o GIL. PyO3 te entrega e você passa adiante onde quer que toque um objeto Python.

Entidades-chave: Pessoas: Josh, Jochen