以下代碼模擬從一組圖像中的不同位置提取二進制字。Numba函數比C++慢並且循環重新排序進一步變慢x10
的Numba在下面的代碼包裝的函數,wordcalc,有2個問題:
- 它是慢3倍相比,在C++中類似的實現。
- 最奇怪的是,如果你切換「廣積」和「IBIT」 for循環的順序,速度下降的10倍(!)。這在C++實現中不會發生,它不受影響。
我使用Numba從0.18.2 2.7 WinPython
可能是什麼造成的?
imDim = 80
numInsts = 10**4
numInstsSub = 10**4/4
bitsNum = 13;
Xs = np.random.rand(numInsts, imDim**2)
iInstInds = np.array(range(numInsts)[::4])
baseInds = np.arange(imDim**2 - imDim*20 + 1)
ofst1 = np.random.randint(0, imDim*20, bitsNum)
ofst2 = np.random.randint(0, imDim*20, bitsNum)
@nb.jit(nopython=True)
def wordcalc(Xs, iInstInds, baseInds, ofst, bitsNum, newXz):
count = 0
for i in iInstInds:
Xi = Xs[i]
for ibit in range(bitsNum):
for ibase in range(baseInds.shape[0]):
u = Xi[baseInds[ibase] + ofst[0, ibit]] > Xi[baseInds[ibase] + ofst[1, ibit]]
newXz[count, ibase] = newXz[count, ibase] | np.uint16(u * (2**ibit))
count += 1
return newXz
ret = wordcalc(Xs, iInstInds, baseInds, np.array([ofst1, ofst2]), bitsNum, np.zeros((iInstInds.size, baseInds.size), dtype=np.uint16))
我認爲切換循環順序時的性能差異與緩存內存有關。 –
@LakshayGarg我認爲是一樣的,但C++實現對此根本不敏感。 – Leo
極不可能,但也許編譯器很聰明,可以爲你優化這個。你正在使用哪種編譯器? –