2022-03-17

【備忘録】Numba を試す

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
#!/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()
view raw test_numba.py hosted with ❤ by GitHub

非力な 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 指定有りです。簡単な処理とはいえ、一億回ループを回して、計算時間が一桁違うのであれば、使ってみる価値は十分ありそうです。また、並列演算にも使えるようなので、使いこなせるようになればパフォーマンス向上に役立ちそうです。

参考サイト

  1. Numba: A High Performance Python Compiler

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ Linuxへ
にほんブログ村

0 件のコメント: