首页 > 解决方案 > Numba 正确实施?

问题描述

不确定这里发生了什么,或者我是否正确使用 Numba,但这里的速度并没有达到预期;请让我知道我缺少什么让 numba 以应有的方式工作。

输出显示 runfile('#####) : Numba-> 0.14654635999977472 :Python-> 0.00047117299982346594

从 numpy 导入日志导入 timeit,从 numba 导入 jit exp

@jit(nopython=True)
def Func():
    n=100
    b=[]
    for i  in range(0,n):
        b.append(log((i/2+52)**2)*exp(.05*10))
   
    
    return(i)

print(timeit.timeit(Func,number=100))



def Func2():
    n=100
    c=[]
    for j  in range(0,n):
        c.append(log((j/2+52)**2)*exp(.05*10))
   
    
    return(j)

print(timeit.timeit(Func,number=100))

标签: python-3.xperformancenumba

解决方案


速度差异的两个原因:(1) Numba 必须在运行代码之前对其进行编译。尝试在计时器之外调用一次函数(强制编译),然后进行计时

(2) 你只进行了 100 次迭代,这对计算机来说不算什么。来自操作系统活动的噪音、计时器的粒度等将使如此小的样本的速度差异相形见绌。尝试进行 10,000 次或更多次迭代(在解决编译问题后)

编辑——如果 OP 将他的循环增加到 1mm 迭代(参见下面的评论),那么代码几乎将所有时间都用于调整数组大小,而不是进行任何计算。

嵌入式数学函数(例如 exp 和 log)已经编译,numba 没有什么可以使用的。Numba 编译只能加速尚未编译的计算和循环。正如所写,循环不能被解开或并行执行,因为 append() 创建了一个串行依赖。

如果 OP 想要查看 numba 和普通 python 之间的区别,他应该寻找具有大量手动计算(而不是嵌入式数学函数)的代码示例。计算 mandlebrot 集就是一个例子;numba 将比独立 python 快许多倍地进行这些计算。


推荐阅读