我试图在Numba加速计算联合发生的最小条件概率的函数。为什么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
[注:我可以一半的执行时间,由于问题的对称性 - 但是这不是我的主要关注]
如果'X'具有形状'[ m,n]',你需要结果是'[m,m]还是'[n,n]'?你的问题和你的答案是不同的。 –
原问题已更正......谢谢......''X''有形状''[m,n]''并计算共点我比较所有可能的列向量组合,因此导致''[n, n]矩阵。 – sanguineturtle
我问过,因为现在你的代码运行得足够快,所以对缓存友好性进行优化是明智的。目前,您正在非连续地访问'X',假设'X'是连续的并且是C-次序的,这导致次优的RAM访问。为了看到性能的差异,使'X'为方形数组,并将具有'X'和'X.T'的函数作为参数。 –