Pydantic v2's Rust core hides a costly secret at the Python boundary

Libraries Run Rust Inside Python (With PyO3)

Pydantic v2's Rust core hides a costly secret at the Python boundary

Pydantic v2's speed comes from pydantic-core, a Rust extension built with PyO3. This post walks through a JSON parser in Rust exposed to Python via PyO3 and maturin. The surprising bottleneck: converting the parsed Rust tree into Python objects can cost more than the parsing itself. For large documents, that materialization loop dominates end-to-end time. The advice: profile the boundary, not just the algorithm, and consider lazy views instead of eagerly building the whole tree.

A document with 100,000 values means on the order of 100,000 Python objects being created at the boundary, all after parsing is completely done.
  1. simonw

    I was a bit nervous about this trend when it started picking up because I care about Pyodide (Python running via WebAssembly) and libraries that use PyO3 might not work in Pyodide.

    Thankfully that's now been mostly solved - you can compile and publish WASM builds of Rust or C extensions on PyPI now and a Pyodide can then use them.

    Here's the WASM build of the Rust-including Pydantic-core package for example: https://pypi.org/project/pydantic_core/#pydantic_core-2.49.0...

  2. the__alchemist

    This is a nice party trick! I use it to provide easy installation of software that is written in rust, but is primarily used by Python users. (e.g.: Biology tools) They can do `pip install <name>`, since some people prefer this over downloading executables/installers. Bonus: Maturin/PyO3 can build "manylinux" binaries automatically, which helps with the Linux ABI diaspora.

  3. skeledrew

    But does it work everywhere Python works? My main issue with this Rust move has always been compatibility. Python can be embedded and ran in a heck of a lot of places. What's the story when libraries that I may want to depend on are actually implemented in Rust and my target doesn't/can't handle the toolchain and there's no build target?

  4. roywiggins

    > reach for, a Rust extension does the work

    ai; dr, sorry

  5. startup_zombie_

    How much of the existing PyPI ecosystem do you think could realistically work this way without package authors doing anything specifically for WASM?

More from this day

2026-09-13