Я пытаюсь вычислить большое количество GCD(x,y)
как часть Euler 625 , и, поскольку это занимает много времени, я попытался добавить @numba jit
, чтобы ускорить его.
Я проверил похожий вопрос, как это , это и это , но они не помогают (я не использую numpy
или параллельныев состоянии функций (например, sum
), и я вызывал функции несколько раз - так что компиляция лени тоже не проблема) В результате:
with numba: 8.220806121826172 seconds
without numba: 1.242861270904541 seconds
мой код добавлен ниже.
- почему numba замедляет меня?
как я могу выполнить это быстрее (исходный лимит 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()