numba jit是否有可能减慢我的gcd执行速度?

时间:2018-09-20 07:03:04

标签: python jit numba

我正在尝试计算大量GCD(x,y)作为Euler 625的一部分,由于这需要花费大量时间,因此我尝试添加@numba jit以加快速度。

我检查了类似的问题,例如thisthisthis,但它们没有帮助(我没有使用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 :(得分:2)

numba不支持词典,因此它退回到Python模式,这会导致运行时开销。

如果您将@jit替换为@jit(nopython=True),则会发现JIT编译失败,这将禁止切换到Python,以便在使用不受支持的Python功能时收到错误消息。