私は最近numbaにつまずいて、手作りのC拡張をより洗練された自動ピットコードに置き換えることを考えました。残念ながら、私は最初の、迅速なベンチマークを試みたとき、私は満足していませんでした。numbaのnumpy配列へのアクセスを最適化
10 loops, best of 3: 52 ms per loop
10 loops, best of 3: 42.2 ms per loop
10 loops, best of 3: 43.5 ms per loop
1000 loops, best of 3: 321 us per loop
私が実行している:これは私のマシン上で与え
from numba import jit, autojit, uint, double
import numpy as np
import imp
import logging
logging.getLogger('numba.codegen.debug').setLevel(logging.INFO)
def sum_accum(accmap, a):
res = np.zeros(np.max(accmap) + 1, dtype=a.dtype)
for i in xrange(len(accmap)):
res[accmap[i]] += a[i]
return res
autonumba_sum_accum = autojit(sum_accum)
numba_sum_accum = jit(double[:](int_[:], double[:]),
locals=dict(i=uint))(sum_accum)
accmap = np.repeat(np.arange(1000), 2)
np.random.shuffle(accmap)
accmap = np.repeat(accmap, 10)
a = np.random.randn(accmap.size)
ref = sum_accum(accmap, a)
assert np.all(ref == numba_sum_accum(accmap, a))
assert np.all(ref == autonumba_sum_accum(accmap, a))
%timeit sum_accum(accmap, a)
%timeit autonumba_sum_accum(accmap, a)
%timeit numba_sum_accum(accmap, a)
accumarray = imp.load_source('accumarray', '/path/to/accumarray.py')
assert np.all(ref == accumarray.accum(accmap, a))
%timeit accumarray.accum(accmap, a)
:numbaがここで普通のpythonよりもはるかに良いやっていないように私はほぼCのようなパフォーマンスを期待しているだろうけれどもそれは、そうですpypiから最新のnumbaバージョン、0.11.0。任意の提案、どのようにコードを修正するため、それはnumbaと合理的に高速で実行されますか?
numbaがありますコード、およびnumpy配列。最適に加速することができない特別な機能。純粋なPythonで独自のmax関数を書いて、それを自動化すると、おそらくもっと速くなるでしょう。 – M4rtini
私はnumbaのコードを調べました。多くの数値関数の場合、入力を見て関数の動作を知ることで出力データ型を正しく決定します。型推論と呼ばれています。例: 'np.sum'と' np.prod'を使用しますが、minとmaxはコードにリストされていません。私はバグレポートを提出しました。 – Michael