今回はPythonからRustを呼び出して
超高速化する方法についてです。
解説動画はこちら
そんな時はRustの高速なネイティブコードを
Pythonから呼び出して計算速度を上げられます。
Python-Rust連携の方法
早速手順を見ていきましょう。
なおGoogle ColabでのRust-Python連携方法になります。
自前のPCだとかだと、少し手順は変わってきます。
まず初めはColab内に必要なものをインストールします
その中にプロジェクトを作り移動します。
UIのフォルダマークからディレクトリが
作成されていると思います。
すでにあるコードを上書きする形で
コードを書き換えます。
ここでは簡単な計算を行うコードを指定して
関数を作っています。
設定用のファイルも上書きします。
RustコードをPythonライブラリとしてビルドします。
1-5までが出来ていたら
ライブラリを呼び出して、Rustの関数が実行できます。
これで速度比較が出せると思います。
どれくらいの速度差になるかは
是非動画の方を見てみてください。
動画内ではもう一つの
シミュレーションも行っていますので
参考になると思います。
まとめ
最近はPolarsなどの大量データ処理や
深層学習モデルの構築や推論なども
超高速化する方法についてです。
解説動画はこちら
Pythonは書きやすくて便利だけど
他の言語に比べるとどうしても遅い。
他の言語に比べるとどうしても遅い。
そんな時はRustの高速なネイティブコードを
Pythonから呼び出して計算速度を上げられます。
Python-Rust連携の方法
maturin
Rustで書かれたコードをPythonのパッケージ(wheel形式)
としてビルド・公開するためのビルドツールです。
これを使ってPythonとRustを連携させます。
主な手順は以下です。
としてビルド・公開するためのビルドツールです。
これを使ってPythonとRustを連携させます。
主な手順は以下です。
1.Rust と maturin をインストール
2.Rust拡張用のプロジェクトを作る
3.Rustコードを作る
4.Cargo.toml を修正する
5.Python用拡張としてビルドする
早速手順を見ていきましょう。
なおGoogle ColabでのRust-Python連携方法になります。
自前のPCだとかだと、少し手順は変わってきます。
1.Rust と maturin をインストール
まず初めはColab内に必要なものをインストールします
# Rust をインストール
!curl https://sh.rustup.rs -sSf | sh -s -- -y -q
import os
os.environ["PATH"] = f"{os.environ['HOME']}/.cargo/bin:" + os.environ["PATH"]
!rustc --version
!cargo --version
!pip install -U maturin
!maturin --version
2. Rust拡張用のプロジェクトを作る
デフォルトのディレクトリはcontentになっているのでその中にプロジェクトを作り移動します。
!maturin init fastcalc %cd /content/fastcalc
UIのフォルダマークからディレクトリが
作成されていると思います。
3. Rustコードを作る
すでにあるコードを上書きする形で
コードを書き換えます。
ここでは簡単な計算を行うコードを指定して
関数を作っています。
%%writefile src/lib.rs
use pyo3::prelude::*;
#[pyfunction]
fn sum_squares(n: u64) -> u64 {
let mut s = 0;
for i in 0..n {
s += i * i;
}
s
}
#[pymodule]
fn fastcalc(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(sum_squares, m)?)?;
Ok(())
}
4. Cargo.toml を修正
設定用のファイルも上書きします。
%%writefile Cargo.toml
[package]
name = "fastcalc"
version = "0.1.0"
edition = "2021"
[lib]
name = "fastcalc"
crate-type = ["cdylib"]
[dependencies]
pyo3 = { version = "0.21", features = ["extension-module"] }
5. Python用拡張としてビルド
RustコードをPythonライブラリとしてビルドします。
# Python環境から Rust を見えるように PATH を追加 !export PATH="$HOME/.cargo/bin:$PATH" # wheel を作る !maturin build --release # wheel を pip install !pip install target/wheels/*.whl
6.Pythonから Rust 関数を呼ぶ
1-5までが出来ていたら
ライブラリを呼び出して、Rustの関数が実行できます。
import fastcalc fastcalc.sum_squares(100_000_000)
7.Python版と速度比較
これで速度比較が出せると思います。
import time
def sum_squares_py(n):
s = 0
for i in range(n):
s += i * i
return s
N = 100_000_000
t0 = time.time()
sum_squares_py(N)
t1 = time.time()
python_time = t1 - t0
t2 = time.time()
fastcalc.sum_squares(N)
t3 = time.time()
rust_time = t3 - t2
print("Python: {:.8f} sec".format(python_time))
print("Rust : {:.8f} sec".format(rust_time))
print("Rust vs Python : {:.10f}".format(python_time / rust_time))
どれくらいの速度差になるかは
是非動画の方を見てみてください。
動画内ではもう一つの
シミュレーションも行っていますので
参考になると思います。
まとめ
maturinを使ったRustコードのPython拡張を作って実行できるようにすると
実行速度が高速な関数を呼び出せるようになります。
Pythonの簡単さはそのままに、重い計算はRustに任せる
これが Python × Rust 連携の最強パターンです。
最近はPolarsなどの大量データ処理や
深層学習モデルの構築や推論なども
Rust製ライブラリが増えてきています。
無いものは自分で作れると
自作の処理の時短になって
めちゃくちゃ捗ります。
自作の処理の時短になって
めちゃくちゃ捗ります。
今日はここまでです
それでは。

コメントする