簡體   English   中英

Numba `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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM