お疲れ様です!IT業界で働くアライグマです!
Pythonの処理速度に不満があるなら、Rustで書いたコードをPythonから呼び出すのが最も効果的な解決策です。PyO3を使えば、RustのパフォーマンスとPythonの使いやすさを両立できます。
「Pythonでデータ処理をしているけど遅い」「NumPyでも限界がある」「Cythonは学習コストが高い」——こうした悩みを持つエンジニアに向けて、本記事ではPyO3を使ったRust製Pythonライブラリの作成方法を、実装例とともに解説します。
なぜPythonの高速化にRustが選ばれるのか
Pythonは生産性が高い言語ですが、CPUバウンドな処理では速度がボトルネックになりがちです。高速化の選択肢としては以下があります。
Python高速化アプローチの比較
- NumPy/Pandas:ベクトル演算に強いが、複雑なロジックには不向き
- Cython:PythonライクにC拡張を書けるが、型定義が煩雑
- Numba:JITコンパイルで高速化できるが、対応関数に制限がある
- Rust + PyO3:最高速かつメモリ安全。学習コストはあるが再利用性が高い
Pure Pythonを1とした場合、NumPyで約15倍、Cythonで約25倍、Rust+PyO3では約50倍の速度向上が期待できます(処理内容による)。
Flash Attentionの仕組みと実装では、メモリ効率を重視した高速化手法を解説しています。
IT女子 アラ美PyO3の基本:環境構築と最小構成
PyO3はRustコードをPythonモジュールとしてビルドするためのクレートです。maturinというビルドツールと組み合わせることで、pip installできるwheelを簡単に生成できます。


環境構築
# Rustのインストール(未インストールの場合)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# maturinのインストール
pip install maturin
# プロジェクト作成
maturin new my_rust_lib --bindings pyo3
cd my_rust_lib
最小構成のRustコード
use pyo3::prelude::*;
/// 2つの数値を加算する関数
#[pyfunction]
fn add(a: i64, b: i64) -> i64 {
a + b
}
/// フィボナッチ数列のn番目を計算
#[pyfunction]
fn fibonacci(n: u64) -> u64 {
match n {
0 => 0,
1 => 1,
_ => {
let mut a = 0u64;
let mut b = 1u64;
for _ in 2..=n {
let c = a + b;
a = b;
b = c;
}
b
}
}
}
/// Pythonモジュールの定義
#[pymodule]
fn my_rust_lib(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_function(wrap_pyfunction!(add, m)?)?;
m.add_function(wrap_pyfunction!(fibonacci, m)?)?;
Ok(())
}
ビルドとインストール
# 開発モードでインストール(編集可能)
maturin develop
# Pythonから呼び出し
python -c "import my_rust_lib; print(my_rust_lib.add(1, 2))"
# 出力: 3
# 本番用wheelのビルド
maturin build --release
Sonic-MoE実践ガイドでは、IO・Tile最適化による高速化手法を解説しています。



実践例:大量データの高速処理をRustで実装する
ここでは、実際のユースケースとして「大量の文字列データをバッチ処理する」例を実装します。
課題:100万件のログ行からパターンマッチングを行う
Pure Pythonで正規表現マッチングを100万行に対して実行すると、数十秒かかることがあります。これをRustで実装し、高速化します。
use pyo3::prelude::*;
use regex::Regex;
/// 正規表現にマッチする行のインデックスを返す
#[pyfunction]
fn find_matching_lines(lines: Vec, pattern: &str) -> PyResult> {
let re = Regex::new(pattern)
.map_err(|e| PyErr::new::(e.to_string()))?;
let indices: Vec = lines
.iter()
.enumerate()
.filter(|(_, line)| re.is_match(line))
.map(|(i, _)| i)
.collect();
Ok(indices)
}
/// 並列処理版(rayonクレートを使用)
#[pyfunction]
fn find_matching_lines_parallel(lines: Vec, pattern: &str) -> PyResult> {
use rayon::prelude::*;
let re = Regex::new(pattern)
.map_err(|e| PyErr::new::(e.to_string()))?;
let indices: Vec = lines
.par_iter()
.enumerate()
.filter(|(_, line)| re.is_match(line))
.map(|(i, _)| i)
.collect();
Ok(indices)
}
Cargo.tomlの依存関係
[dependencies]
pyo3 = { version = "0.22", features = ["extension-module"] }
regex = "1.10"
rayon = "1.10"
MixLMでRAGのリランキングを高速化する実装ガイドでは、類似のパフォーマンス最適化手法を解説しています。



ケーススタディ:ログ解析処理を10倍高速化した事例
あるデータエンジニアリングチームで、ログ解析処理をRust+PyO3で高速化した事例を紹介します。
状況(Before)
- 1日あたり500万行のアクセスログを解析し、異常パターンを検出するバッチ処理
- Pure Python + reモジュールで実装しており、処理に45分かかっていた
- サーバーコストを抑えるためにスケールアップは避けたかった
- Pandasで試したが、正規表現処理がボトルネックで改善は限定的だった
行動(Action)
- PyO3でRust製のログ解析モジュールを導入し高速化:正規表現マッチング処理をRustに移行した。regexクレートとrayonを採用し、並列処理を実装した結果、CPUコアを100%活用できるようになった
- Pythonインターフェースを維持しつつ差し替え:既存のPythonコードの関数呼び出し部分だけを変更し、ロジック全体の書き換えは行わなかった。maturin developで開発中に動作確認しながら進めたところ、移行作業は2日で完了した
- GitHub ActionsでCIを構築:maturin-actionを使い、Linux/macOS/Windows向けのwheelを自動ビルドするパイプラインを追加した。これにより、チームメンバー全員がpip installで利用可能になった
結果(After)
- 処理時間が45分から4.5分に短縮(10倍高速化)
- サーバーコストは変更なし(スケールアップ不要)
- Pythonコードの変更は100行未満で、既存ロジックはほぼそのまま
- チーム内でRustに興味を持つメンバーが増え、他のボトルネック箇所でも同様のアプローチを検討中
時系列データの異常検知をPythonで実装するでは、Pythonベースの異常検知手法を解説しています。
本記事で解説したようなAI技術を、基礎から体系的に身につけたい方は、以下のスクールも検討してみてください。
| 比較項目 | DMM 生成AI CAMP | Aidemy Premium |
|---|---|---|
| 目的・ゴール | ビジネス活用・効率化非エンジニア向け | エンジニア転身・E資格Python/AI開発 |
| 難易度 | プロンプト作成中心 | コード記述あり |
| 補助金・給付金 | リスキリング補助金対象 | 教育訓練給付金対象 |
| おすすめ度 | 今の仕事に活かすなら | AIエンジニアになるなら |
| 公式サイト | 詳細を見る | 詳細を見る |



まとめ
PyO3を使えば、RustのパフォーマンスとPythonの生産性を両立したライブラリを作成できます。
- Rust+PyO3はPure Pythonの約50倍の速度向上が期待できる
- maturinを使えば、pip installできるwheelを簡単にビルド可能
- rayonクレートで並列処理も直感的に実装できる
- 既存のPythonコードを大きく変更せずに、ボトルネック箇所だけRust化できる
最初は学習コストがかかりますが、一度覚えれば再利用性が高く、長期的なパフォーマンス改善に大きく貢献します。ぜひ試してみてください。













