我試圖在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'的函數作爲參數。 –