Numba は、Python と NumPy のコードのサブセットを、高速な機械語に変換するオープンソースの JIT コンパイラです。Numba のサイト [1] によると、Numba デコレータを Python 関数に適用するだけで、実行時に機械語に変換されるということです。
Numba のサイトで紹介されている簡単なサンプルで、Numba の有無で実行速度の差がどのぐらい違うのかを確認してみました。
下記の OS 環境で動作確認をしました。
![]() |
Fedora Silverblue 35 | x86_64 |
Python | 3.10.2 | |
Numba | 0.55.1 |
Numbe は pip コマンドでインストールしました。
(venv) $ pip install numba
以下のサンプルの処理部分は、Numba のサイト [1] で紹介されているモンテカルロ法のサンプルの丸写しです。Numba のデコレータ指定の有無での実行速度の差を計測してみました。
test_numba.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# coding: utf-8 | |
from numba import jit | |
import random | |
import time | |
def benchmark(f): | |
def wrap(*args, **kwargs): | |
time_start = time.time() | |
ret = f(*args, **kwargs) | |
time_end = time.time() | |
msec_elapsed = (time_end - time_start) * 1000. | |
print('{:s} function tool {:.3f} ms'.format(f.__name__, msec_elapsed)) | |
return ret | |
return wrap | |
@benchmark | |
def monte_carlo_pi_1(nsamples): | |
acc = 0 | |
for i in range(nsamples): | |
x = random.random() | |
y = random.random() | |
if (x ** 2 + y ** 2) < 1.0: | |
acc += 1 | |
return 4.0 * acc / nsamples | |
@benchmark | |
@jit(nopython=True) | |
def monte_carlo_pi_2(nsamples): | |
acc = 0 | |
for i in range(nsamples): | |
x = random.random() | |
y = random.random() | |
if (x ** 2 + y ** 2) < 1.0: | |
acc += 1 | |
return 4.0 * acc / nsamples | |
def main(): | |
n = 10000000 | |
ans1 = monte_carlo_pi_1(n) | |
print('Pi =', ans1) | |
ans2 = monte_carlo_pi_2(n) | |
print('Pi =', ans2) | |
if __name__ == '__main__': | |
main() |
非力な CPU (Intel Celeron N4020) を搭載した PC による結果です。
monte_carlo_pi_1 function tool 11921.090 ms
Pi = 3.140964
monte_carlo_pi_2 function tool 2346.997 ms
Pi = 3.1419032
monte_carlo_pi_1 が Numba 指定無し、monte_carlo_pi_2 が Numba 指定有りです。簡単な処理とはいえ、一億回ループを回して、計算時間が一桁違うのであれば、使ってみる価値は十分ありそうです。また、並列演算にも使えるようなので、使いこなせるようになればパフォーマンス向上に役立ちそうです。
参考サイト

にほんブログ村
0 件のコメント:
コメントを投稿