Numba は、数値コードの実行を高速化する優れたソリューションのようです。ただし、配列への割り当てがある場合、Numba は標準の Python コードよりも遅いようです。Numba の有無にかかわらず、配列/スカラーに書き込む 4 つの選択肢を比較するこの例を考えてみましょう。
(計算は、スカラーへの割り当てと配列セルへの割り当てという問題に焦点を当てるために、意図的に非常に単純に保たれています)
@autojit
def fast_sum_arr(arr):
z = arr.copy()
M = len(arr)
for i in range(M):
z[i] += arr[i]
return z
def sum_arr(arr):
z = arr.copy()
M = len(arr)
for i in range(M):
z[i] += arr[i]
return z
@autojit
def fast_sum_sclr(arr):
z = 0
M = len(arr)
for i in range(M):
z += arr[i]
return z
def sum_sclr(arr):
z = 0
M = len(arr)
for i in range(M):
z += arr[i]
return z
IPython の %timeit を使用して、取得した 4 つの選択肢を評価します。
In [125]: %timeit fast_sum_arr(arr)
100 loops, best of 3: 10.8 ms per loop
In [126]: %timeit sum_arr(arr)
100 loops, best of 3: 4.11 ms per loop
In [127]: %timeit fast_sum_sclr(arr)
100000 loops, best of 3: 10 us per loop
In [128]: %timeit sum_sclr(arr)
100 loops, best of 3: 2.93 ms per loop
Numba でコンパイルされていないsum_arr は、Numba でコンパイルされた fast_sum_arr よりも 2 倍以上高速です。一方、Numba でコンパイルされた fast_sum_sclr は、Numbaでコンパイルされていない sum_sclr よりも 2 桁以上高速です。
そのため、Numba は sum_sclr を高速化するタスクを非常にうまく実行しますが、実際には sum_arr の実行を遅くします。sum_sclr と sum_arr の唯一の違いは、前者はスカラーに割り当てられ、後者は配列セルに割り当てられることです。
関係があるかどうかはわかりませんが、最近ブログhttp://www.phi-node.com/で次のことを読みました。
「Numba が直接サポートしていない構造に直面すると、(非常に) 遅いコード パスに切り替えることが判明しました。」
ブログの著者は、Python の max() の代わりに if ステートメントを使用して、Numba のパフォーマンスを大幅に高速化しました。
これに関する洞察はありますか?
ありがとう、
FS