Я пробую 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
Почему это? Может ли это быть связано с поэлементной операцией numpy?
Я использую в качестве примера: http://nbviewer.ipython.org/github/ellisonbg/talk-sicm2-2013/blob/master/NumbaCython.ipynb
[Примечание: я мог бы сократить время выполнения вдвое из-за симметричного характера проблемы, но это не моя главная задача]