【问题标题】:Numba correct implementation?Numba 正确实施?
【发布时间】:2020-11-20 21:24:47
【问题描述】:

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

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

导入时间 从 numpy 导入日志,exp 从 numba 导入 jit

@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))

【问题讨论】:

  • 旁注:不需要重新定义Func2:可以使用Func.py_func来访问未编译的python函数。

标签: python-3.x performance numba


【解决方案1】:

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

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

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

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

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

【讨论】:

  • (1) 代码被编译并运行多次以产生上述数字。我知道在测量之前需要运行一次。
  • (2) 将 N 提高到一百万;相同的故事。你发的不是原因,一定是别的原因。很想知道它是什么?
猜你喜欢
  • 2013-08-22
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 2012-02-19
  • 2019-02-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多