使用numba比使用纯python生成的程序快得多:
现在看来,纯python上的numba甚至(大多数时候)比numpy python快,例如https://jakevdp.github.io/blog/2015/02/24/optimizing-python-with-numpy-and-numba/。在
根据https://murillogroupmsu.com/julia-set-speed-comparison/,在纯python代码中使用numba比在使用numpy的python代码上使用更快。这是真的吗?为什么?在
在https://stackoverflow.com/a/25952400/4533188中,解释了为什么纯python上的numba比numpy python快:numba看到更多的代码,并且有更多的方法来优化代码,而numpy只看到一小部分。在
这能回答我的问题吗?我是否妨碍numba在使用numpy时完全优化我的代码,因为numba被迫使用numpy例程,而不是找到一个更优化的方法?我曾希望麻木能意识到这一点,如果没有好处的话,就不要使用numpy程序。然后它会使用numpy例程,只是这是一个改进(毕竟numpy已经过很好的测试)。毕竟"Support for NumPy arrays is a key focus of Numba development and is currently undergoing extensive refactorization and improvement."
在我回答具体问题之前,让我们先弄清楚一些事情:
不,麻木通常比纽比慢。这取决于你想做什么手术和怎么做。如果您处理非常小的数组,或者如果唯一的替代方法是手动迭代数组,Numba的速度确实更快。在
这取决于代码-可能有更多的情况下,纽比击败了麻木。然而,诀窍是在没有相应的NumPy函数的地方应用numba,或者在需要链接很多NumPy函数或使用不理想的NumPy函数的地方。诀窍在于知道numba实现何时可能更快,然后最好不要在numba中使用NumPy函数,因为这样会得到NumPy函数的所有缺点。然而,需要经验来了解何时应用numba,以及如何应用numba-很容易意外地编写一个非常慢的numba函数。在
是的。在
不,麻木现在不是这样工作的。Numba只是为LLVM创建代码来编译。也许这是numba将来的特色(谁知道呢)。目前,如果您自己编写循环和操作,并且避免在numba函数内部调用NumPy函数,numba的性能最好。在
有一些库使用表达式树并可能优化非有益的NumPy函数调用,但这些库通常不允许快速的手动迭代。例如,
numexpr
可以优化多个链式NumPy函数调用。目前,它要么是快速手动迭代(cython/numba)要么是使用表达式树(expression trees,numexpr)优化链式NumPy调用。也许在一个图书馆里连两个都不可能-我不知道。在Numba和Cython在处理小数组和快速手动迭代时非常棒。NumPy/SciPy非常棒,因为它们有很多复杂的功能,可以在开箱即用的情况下完成各种任务。Numexpr非常适合链接多个NumPy函数调用。在某些情况下,Python比这些工具都快。在
以我的经验,如果你把不同的工具组合起来,你就可以充分利用它们。不要只局限于一种工具。在
Numba只是用它自己的实现替换numpy函数。它们可以更快/更慢,结果也可能不同。问题在于这种替换是如何发生的。经常会涉及不必要的临时数组和循环,它们可以被融合在一起。在
循环融合和移除临时阵列不是一件容易的事。如果为并行目标(循环融合效果更好)或单线程目标编译,则行为也会有所不同。在
[编辑] 在并行加速器中完成的优化Section 1.10.4. Diagnostics(如循环融合)也可以通过设置
parallel=True
和nb.parfor.sequential_parfor_lowering = True
来启用。1示例
计时
^{pr2}$结果
结论
这取决于用例什么是最好的使用。有些算法可以很容易地用Numpy写成几行,而另一些算法则很难或不可能以矢量化的方式实现。在
我还特意用了一个求和的例子。一次完成这一切很容易,而且速度也快得多,但是如果我想要最精确的结果,我肯定会使用一个已经在Numpy中实现的更复杂的算法。当然,你也可以在Numba做同样的事情,但那将是更多的工作要做。在
相关问题 更多 >
编程相关推荐