ボブ・ベルデロス:PyO3 を使って Python の中で ... ノート

ボブ・ベルデロス:PyO3 を使って Python の中で Rust を実行する方法

Pydantic v2のデータ検証は、pyO3を用いて構築されたpydantic-coreというRust拡張に依存しています。この記事では、RustでカスタムJSONパーサーを作成し、それをPythonに公開する方法を実演します。このプロセスは、Rustモジュールを書き、PyO3マクロで注釈を付け、maturinを使ってコンパイル・インストールを行うことから始まります。この例の核となるのは、JSONツリー構造を表すRustのenumです。関数をPythonに公開するには、PythonやBoundのような特定のPyO3注釈や型が必要です。最も重要なのは、Rustのデータ構造をPythonオブジェクトに戻すことです。この「リターントリップ」には多数のPythonオブジェクトを作成する必要があり、大規模なJSON文書の解析よりもコストが高くなることがあります。この変換はIntoPyObjectトレイトの実装によって処理されます。エラーも翻訳する必要があります。RustエラーはFromトレイトを使ってPython例外に変換されます。スカラーリターン値の場合、境界を越えるコストは無視できるほどです。しかし、大規模な構造物では変換コストが非常に大きく、パフォーマンスを支配することがあります。この境界変換を最適化し、場合によっては怠惰なビューを返すことが、RustからPythonへの成功する移植に不可欠です。したがって、RustとPythonの境界のプロファイリングが不可欠です。
CdXz5zHNQW_y8hcnXdNTs.png