gpt4 book ai didi

python - Numba `cache=True ` 无效

转载 作者:行者123 更新时间:2023-12-05 09:11:55 25 4
gpt4 key购买 nike

我写了下面的代码来测试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 的目的是避免在每次运行脚本时重复大型复杂函数的编译时间。在这个例子中,函数很简单,节省的时间有限,但对于具有许多更复杂函数的脚本,使用缓存可以显着减少运行时间。

关于python - Numba `cache=True ` 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59427775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com