我正在尝试计算大量GCD(x,y)
作为Euler 625的一部分,由于这需要花费大量时间,因此我尝试添加@numba jit
以加快速度。
我检查了类似的问题,例如this,this和this,但它们没有帮助(我没有使用numpy
或使用可并行函数(例如sum
),我多次调用了这些函数-因此,懒惰也不是问题)
结果是:
with numba: 8.220806121826172 seconds
without numba: 1.242861270904541 seconds
下面添加了我的代码。
我如何才能更快地执行此操作(最初的限制是10 ** 11,这在这种情况下似乎无法计算)
import time
from numba import jit, int32
gcd_dict = {}
#@jit
def gcd(x, y ,k = None, reverse_k = None):
if not k:
k = (x,y)
reverse_k = (y,x)
if k in gcd_dict:
return gcd_dict[k]
elif reverse_k in gcd_dict:
return gcd_dict[reverse_k]
if not y:
if len(gcd_dict) < 10**6:
gcd_dict[k] = x
gcd_dict[reverse_k] = x
return x
else:
return gcd(y, x % y, k, reverse_k)
def main():
t = time.time()
s = 0
# i_limit = 10**11+1
i_limit = 10**3
for i in range(1,i_limit):
for j in range(1,i+1):
s += gcd(i,j)
print(s)
print(time.time() - t)
main()
答案 0 :(得分:2)
numba
不支持词典,因此它退回到Python模式,这会导致运行时开销。
如果您将@jit
替换为@jit(nopython=True)
,则会发现JIT编译失败,这将禁止切换到Python,以便在使用不受支持的Python功能时收到错误消息。