同時発生の最小条件付き確率を計算する関数を高速化するために Numba を試しています。
import numpy as np
from numba import double
from numba.decorators import jit, autojit
X = np.random.random((100,2))
def cooccurance_probability(X):
P = X.shape[1]
CS = np.sum(X, axis=0) #Column Sums
D = np.empty((P, P), dtype=np.float) #Return Matrix
for i in range(P):
for j in range(P):
D[i, j] = (X[:,i] * X[:,j]).sum() / max(CS[i], CS[j])
return D
cooccurance_probability_numba = autojit(cooccurance_probability)
cooccurance_probability
ただし、とのパフォーマンスはcooccurance_probability_numba
ほぼ同じであることがわかりました。
%timeit cooccurance_probability(X)
1 loops, best of 3: 302 ms per loop
%timeit cooccurance_probability_numba(X)
1 loops, best of 3: 307 ms per loop
どうしてこれなの?要素操作ごとの派手な要素が原因でしょうか?
私は例として次のとおりです: http://nbviewer.ipython.org/github/ellisonbg/talk-sicm2-2013/blob/master/NumbaCython.ipynb
[注: 問題の対称性により、実行時間を半分にすることができましたが、それは私の主な関心事ではありません]