Pythonライブラリの内部でRustが動く仕組み、PyO3の「帰り道」が重い理由
Libraries Run Rust Inside Python (With PyO3)

Pydantic v2の心臓部pydantic-coreはPyO3でRustをPythonに橋渡ししている。本記事は同じ手法でJSONパーサをRustで書き、Pythonからimportできるようにする。注目すべきは戻り値の変換コストだ。RustのenumツリーをPythonオブジェクトに再構築する処理は、10万ノードの文書ではパース自体より時間がかかりうる。ボトルネックは境界にある。
大きな文書では、この実体化ループが、パースではなく、エンドツーエンドの時間を支配することがある。
HNでの議論
40- simonw
この流れが加速し始めた頃は少し不安でした。というのも、私はPyodide(WebAssembly上で動くPython)を気にかけていて、PyO3を使うライブラリはPyodideでは動かないかもしれないからです。
ありがたいことに、今ではほぼ解決しています。RustやC拡張のWASMビルドをPyPIでコンパイル・公開できるようになり、Pyodideがそれを使えるようになりました。
例えば、Rustを含むPydantic-coreパッケージのWASMビルドはこちらです:https://pypi.org/project/pydantic_core/#pydantic_core-2.49.0...
- the__alchemist
これは素敵なパーティトリックです!私はRustで書かれているが主にPythonユーザーに使われるソフトウェア(例えば生物学ツール)を簡単にインストールできるようにするためにこれを使っています。実行ファイルやインストーラーをダウンロードするよりこれを好む人もいるので、`pip install <name>`で済みます。おまけに、Maturin/PyO3は自動的に「manylinux」バイナリをビルドできるので、LinuxのABIの多様性問題にも役立ちます。
- skeledrew
でも、Pythonが動くところならどこでも動くのでしょうか?このRustへの移行で私が常に気にしているのは互換性です。Pythonは本当にたくさんの場所に埋め込んで実行できます。依存したいライブラリが実際にはRustで実装されていて、自分のターゲットがツールチェーンを扱えない、あるいはビルドターゲットが存在しない場合、どうなるのでしょうか?
- roywiggins
> 手を伸ばせば、Rust拡張が仕事をしてくれる
AI; dr、すみません
- startup_zombie_
既存のPyPIエコシステムのうち、パッケージ作者がWASM専用のことを何もせずに、現実的にこの方法で動くのはどれくらいだと思いますか?