Numba

Numba(ナンバ)はPythonのJIT(Just In Time)コンパイラです。簡単にいえば,Pythonの自前の関数を高速にする仕組みです。

速さ比べのため,まずは100万個の乱数を用意します:

import numpy as np

rng = np.random.default_rng()
a = rng.random(1000000)

これをPython標準の sum() 関数を使って合計するのに要する時間を計測します:

%timeit sum(a)

結果:

99.9 ms ± 460 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

約100ミリ秒(0.1秒)です。次は,自前の関数を作って,時間を計測します:

def sum1(a):
    s = 0
    for x in a:
        s += x
    return s

%timeit sum1(a)

結果:

122 ms ± 287 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

やはり100ミリ秒少々です。次は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.01 ms ± 5.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

約1ミリ秒です。100倍速くなりました。最後にNumPyの np.sum() も試します:

%timeit np.sum(a)

結果:

505 µs ± 3.12 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Numbaで高速化したものより2倍高速です。

つまり,ループを含むようなPythonのコードはたいていNumbaで高速化できますが,同じ機能のNumPy関数があるなら,そちらを使いましょう。


Last modified: