Numba(ナンバ)はPythonのJIT(Just In Time)コンパイラです。簡単にいえば,Pythonの自前の関数を高速にする仕組みです。以下は M1 Mac mini 上の Python 3.10.5 で実行しました。
速さ比べのため,まずは100万個の乱数を用意します:
import numpy as np
rng = np.random.default_rng()
a = rng.random(1000000)
これをPython標準の sum()
関数を使って合計するのに要する時間を計測します:
%timeit sum(a)
結果:
35.6 ms ± 46.3 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
次は,自前の関数を作って,時間を計測します:
def sum1(a):
s = 0
for x in a:
s += x
return s
%timeit sum1(a)
結果:
43.4 ms ± 805 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
次はNumbaを使ってみましょう。pip install numba
などとしてインストールしてから,次を実行します:
from numba import jit
@jit(nopython=True)
def sum2(a):
s = 0
for x in a:
s += x
return s
%timeit sum2(a)
結果:
1.2 ms ± 50.4 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
約1ミリ秒です。数十倍速くなりました。最後にNumPyの np.sum()
も試します:
%timeit np.sum(a)
結果:
187 µs ± 865 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
Numbaで高速化したものよりさらに高速です。
つまり,ループを含むようなPythonのコードはたいていNumbaで高速化できますが,同じ機能のNumPy関数があるなら,そちらを使いましょう。
参考:
Last modified: