我正在玩numba加速我的代碼。我注意到在函式內部使用時性能差異np.inf很大np.nan。下面我附上了三個示例函式進行說明。
function1不被 加速numba。function2并且function3兩者都被加速numba,但一種用途np.nan而另一種用途np.inf。
在我的機器上,三個函式的平均運行時間分別0.032284s是0.041548s和0.019712s。看來 usingnp.nan比np.inf. 為什么性能差異很大?提前致謝。
編輯:我正在使用Python 3.7.11and Numba 0.55.Orc1。
import numpy as np
import numba as nb
def function1(array1, array2):
nr, nc = array1.shape
output1 = np.empty((nr, nc), dtype='float')
output2 = np.empty((nr, nc), dtype='float')
output1[:] = np.nan
output2[:] = np.nan
for r in range(nr):
row1 = array1[r]
row2 = array2[r]
diff = row1 - row2
id_threshold =np.nonzero( (row1 - row2) > 8 )
output1[r][id_threshold] = 1
output2[r][id_threshold] = 0
output1 = output1.flatten()
output2 = output2.flatten()
id_keep = np.nonzero(output1 != np.nan)
output1 = output1[id_keep]
output2 = output2[id_keep]
output = np.vstack((output1, output2))
return output
@nb.njit('float64[:,::1](float64[:,::1], float64[:,::1])', parallel=True)
def function2(array1, array2):
nr, nc = array1.shape
output1 = np.empty((nr,nc), dtype='float')
output2 = np.empty((nr, nc), dtype='float')
output1[:] = np.nan
output2[:] = np.nan
for r in nb.prange(nr):
row1 = array1[r]
row2 = array2[r]
diff = row1 - row2
id_threshold =np.nonzero( (row1 - row2) > 8 )
output1[r][id_threshold] = 1
output2[r][id_threshold] = 0
output1 = output1.flatten()
output2 = output2.flatten()
id_keep = np.nonzero(output1 != np.nan)
output1 = output1[id_keep]
output2 = output2[id_keep]
output = np.vstack((output1, output2))
return output
@nb.njit('float64[:,::1](float64[:,::1], float64[:,::1])', parallel=True)
def function3(array1, array2):
nr, nc = array1.shape
output1 = np.empty((nr,nc), dtype='float')
output2 = np.empty((nr, nc), dtype='float')
output1[:] = np.inf
output2[:] = np.inf
for r in nb.prange(nr):
row1 = array1[r]
row2 = array2[r]
diff = row1 - row2
id_threshold =np.nonzero( (row1 - row2) > 8 )
output1[r][id_threshold] = 1
output2[r][id_threshold] = 0
output1 = output1.flatten()
output2 = output2.flatten()
id_keep = np.nonzero(output1 != np.inf)
output1 = output1[id_keep]
output2 = output2[id_keep]
output = np.vstack((output1, output2))
return output
array1 = 10*np.random.random((1000,1000))
array2 = 10*np.random.random((1000,1000))
output1 = function1(array1, array2)
output2 = function2(array1, array2)
output3 = function3(array1, array2)
uj5u.com熱心網友回復:
第二個要慢得多,因為它output1 != np.nan回傳一個副本output1,因為np.nan != np.nan它True(像任何其他值一樣 -v != np.nan始終為真)。因此,要計算的結果陣列要大得多,從而導致執行速度變慢。
關鍵是您絕不能將值與np.nan使用比較運算子進行比較:np.isnan(value)改用。在您的情況下,您應該使用np.logical_not(np.isnan(output1)).
由于創建的臨時陣列,第二個實作可能會稍微慢一些np.logical_not(一旦代碼被更正,我沒有看到在我的機器上使用 NaN 或 Inf 之間有任何統計上的顯著差異)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/414381.html
標籤:
