PyO3/rust-numpy

PyO3-based Rust bindings of the NumPy C-API

これは何か

rust‑numpy は Rust から NumPy の C‑API を呼び出すための Rust ライブラリであり、Rust 関数を Python モジュールとして公開することもできます。実際には、2 つのエコシステムを橋渡しします:NumPy 配列と連携する高性能な Rust コードを書くことができ、Rust で Python 拡張を書くこともできます。

なぜ重要か

  • 速度と安全性 – Rust はゼロコスト抽象化とメモリ安全性の保証を提供し、NumPy が使用する同じ ndarray 構造を操作できます。
  • シームレスな相互運用 – 手動のポインタ操作は不要です。この crate は安全なラッパー(PyArray、PyReadonlyArray など)を提供し、Rust の ndarray 型との変換を行います。
  • 双方向対応 – 次のいずれかが可能です:
    1. Rust で Python モジュールを書く(NumPy 配列を受け取る/返す #[pyfunction] を公開)、または
    2. Rust バイナリから Python/NumPy を駆動する(インタープリタを埋め込み、np 関数を呼び出し、結果を読み取る)。
  • 既存の crate を活用 – Python バインディングには PyO3、Rust 側の行列処理には ndarray に基づいています。

コア機能(README に記載の通り)

機能 得られるもの
NumPy C‑API バインディング データをコピーせずに NumPy 配列に直接アクセス。
安全な Rust ラッパー PyArrayDyn<T>、PyReadonlyArrayDyn<T>、IntoPyArray などの型、および借用メソッド(as_array、as_array_mut)。
自動変換 into_pyarray と as_array を介して ndarray::Array* と NumPy 配列を変換。
例 シンプルなモジュール(axpy、mult)と、np.absolute を呼び出すための Python 埋め込みの例。
並列・線形代数サポート 例のプロジェクトでは、並列処理に rayon、BLAS/LAPACK 操作に ndarray‑linalg を使用。
バージョン互換性 Rust ≥ 1.85、Python ≥ 3.9、NumPy ≥ 1.16、および一連の ndarray バージョン(0.15‑0.17)をサポート。

誰が使うか

  • データサイエンス/ML 開発者 – パフォーマンスが重要なカーネルを Rust で書きたいが、慣れた Python/NumPy ワークフロー内に留まりたい人。
  • Rust 開発者 – Python 拡張(カスタム NumPy ufunc、高速な前処理ステップなど)を構築する人。
  • 研究者 – Rust ベースのアルゴリズムと既存の Python コードベース間の安全で高速な相互運用が必要な人。

はじめに(クイックステップ)

  1. Cargo.toml に追加:
    [dependencies]
    pyo3 = { version = "0.30", features = ["auto-initialize"] }
    numpy = "0.30"
    
  2. numpy::{PyArray, PyReadonlyArray, IntoPyArray} を使用する Rust 関数を書き、#[pyfunction] で注釈します。
  3. crate を cdylib としてビルドし、他の拡張モジュールと同様に Python からインポートします。
  4. または、Python::with_gil(|py| { … }) を呼び出す通常の fn main() を書き、Rust から Python コードを実行します。

制限/注意点(README より)

  • ターゲットの Python 環境に互換性のある NumPy インストールが必要です。
  • この crate は ndarray を再エクスポートします。異なる ndarray バージョンに依存する場合は、cargo update で手動でバージョンを統一する必要があるかもしれません。
  • 最近のリリース(0.29/0.30)では、Python 3.7/3.8 のサポートが廃止されました。

コミュニティと貢献

  • GitHub で問題やプルリクエストを歓迎します。
  • このプロジェクトは PyO3 の貢献ガイドラインに従い、議論用の Gitter チャンネルがあります。

上記の情報はすべてリポジトリの README から直接取得したものであり、外部の仮定は追加されていません。

関連

  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト