Возможно ли, что numba jit замедляет выполнение моего gcd? - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь вычислить большое количество GCD(x,y) как часть Euler 625 , и, поскольку это занимает много времени, я попытался добавить @numba jit, чтобы ускорить его.

Я проверил похожий вопрос, как это , это и это , но они не помогают (я не использую numpy или параллельныев состоянии функций (например, sum), и я вызывал функции несколько раз - так что компиляция лени тоже не проблема) В результате:

with    numba: 8.220806121826172 seconds
without numba: 1.242861270904541 seconds

мой код добавлен ниже.

  1. почему numba замедляет меня?
  2. как я могу выполнить это быстрее (исходный лимит 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()
    

1 Ответ

0 голосов
/ 20 сентября 2018

Словари не поддерживаются numba, поэтому он возвращается к режиму Python, что приводит к накладным расходам во время выполнения.

Вы можете увидеть, что JIT-компиляция завершится неудачно, если вы замените @jit на @jit(nopython=True), что отключит переключение на Python, так что вы получите сообщение об ошибке в случае использования неподдерживаемых функций Python.

...