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型との変換を行います。 - 双方向対応 – 次のいずれかが可能です:
- Rust で Python モジュールを書く(NumPy 配列を受け取る/返す
#[pyfunction]を公開)、または - Rust バイナリから Python/NumPy を駆動する(インタープリタを埋め込み、
np関数を呼び出し、結果を読み取る)。
- Rust で Python モジュールを書く(NumPy 配列を受け取る/返す
- 既存の 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 コードベース間の安全で高速な相互運用が必要な人。
はじめに(クイックステップ)
Cargo.tomlに追加:[dependencies] pyo3 = { version = "0.30", features = ["auto-initialize"] } numpy = "0.30"numpy::{PyArray, PyReadonlyArray, IntoPyArray}を使用する Rust 関数を書き、#[pyfunction]で注釈します。- crate を
cdylibとしてビルドし、他の拡張モジュールと同様に Python からインポートします。 - または、
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 から直接取得したものであり、外部の仮定は追加されていません。
関連
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト