[英]Numba try: if array.shape[1] - error: tuple index out of range. works without numba, doesn't work with @njit(fastmath=True, nogil=True, cache=True)
[英]Numba `cache=True ` has no effect
我寫下面的代碼來測試 numba 的緩存功能
import numba
import numpy as np
import time
@numba.njit(cache=True)
def sum2d(arr):
M, N = arr.shape
result = 0.0
for i in range(M):
for j in range(N):
result += arr[i,j]
return result
a=np.random.random((1000,100))
print(time.time())
sum2d(a)
print(time.time())
print(time.time())
sum2d(a)
print(time.time())
雖然在pycache文件夾中生成了一些緩存文件,但時間總是一樣的
1576855294.8787484
1576855295.5378428
1576855295.5378428
1576855295.5388253
無論我運行這個腳本多少次,這意味着第一次運行sum2d
需要更多的時間來編譯。 那么pycache文件夾中緩存文件的用途是什么?
以下腳本說明了cache=True
的要點。 它首先調用一個非緩存的dummy
函數來吸收初始化numba
所需的時間。 然后,它與調用兩次進行sum2d
功能,無緩存和兩倍的sum2d
與緩存功能。
import numba
import numpy as np
import time
@numba.njit
def dummy():
return None
@numba.njit
def sum2d_nocache(arr):
M, N = arr.shape
result = 0.0
for i in range(M):
for j in range(N):
result += arr[i,j]
return result
@numba.njit(cache=True)
def sum2d_cache(arr):
M, N = arr.shape
result = 0.0
for i in range(M):
for j in range(N):
result += arr[i,j]
return result
start = time.time()
dummy()
end = time.time()
print(f'Dummy timing {end - start}')
a=np.random.random((1000,100))
start = time.time()
sum2d_nocache(a)
end = time.time()
print(f'No cache 1st timing {end - start}')
a=np.random.random((1000,100))
start = time.time()
sum2d_nocache(a)
end = time.time()
print(f'No cache 2nd timing {end - start}')
a=np.random.random((1000,100))
start = time.time()
sum2d_cache(a)
end = time.time()
print(f'Cache 1st timing {end - start}')
a=np.random.random((1000,100))
start = time.time()
sum2d_cache(a)
end = time.time()
print(f'Cache 2nd timing {end - start}')
第一次運行后的輸出:
Dummy timing 0.10361385345458984
No cache 1st timing 0.08893513679504395
No cache 2nd timing 0.00020122528076171875
Cache 1st timing 0.08929300308227539
Cache 2nd timing 0.00015544891357421875
第二次運行后的輸出:
Dummy timing 0.08973526954650879
No cache 1st timing 0.0809786319732666
No cache 2nd timing 0.0001163482666015625
Cache 1st timing 0.0016787052154541016
Cache 2nd timing 0.0001163482666015625
這個輸出告訴我們什么?
numba
的時間不可忽略。cache=True
的用途) 使用cache=True
是避免在每次運行腳本時重復大型復雜函數的編譯時間。 在這個例子中,函數很簡單,節省的時間有限,但對於具有許多更復雜函數的腳本,使用緩存可以顯着減少運行時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.