<p>在我回答具体问题之前,让我们先弄清楚一些事情:</p>
<ul>
<li>对于这个答案,我只考虑nopython代码,对象模式代码通常比纯Python/NumPy等效代码慢。在</li>
<li>对于这个答案,我将忽略numba GPU的功能-很难比较GPU上运行的代码和CPU上运行的代码。在</li>
<li>在numba函数中调用NumPy函数时,实际上并不是在调用NumPy函数。numba支持的一切都在numba中重新实现。这适用于NumPy函数,也适用于numba中的Python数据类型!因此,numba函数内部和外部Python/NumPy之间的实现细节可能不同,因为它们是完全不同的函数/类型。在</li>
<li>Numba生成用LLVM编译的代码。Numba不是魔术,它只是一个优化编译器的包装,它内置了一些优化!在</li>
</ul>
<blockquote>
<p>It seems established by now, that numba on pure python is even (most of the time) faster than numpy-python</p>
</blockquote>
<p>不,麻木通常比纽比慢。这取决于你想做什么手术和怎么做。如果您处理非常小的数组,或者如果唯一的替代方法是手动迭代数组,Numba的速度确实更快。在</p>
<blockquote>
<p>numba used on pure python code is faster than used on python code that uses numpy. Is that generally true and why?</p>
</blockquote>
<p>这取决于代码-可能有更多的情况下,纽比击败了麻木。然而,诀窍是在没有相应的NumPy函数的地方应用numba,或者在需要链接很多NumPy函数或使用不理想的NumPy函数的地方。诀窍在于<strong>知道numba实现何时可能更快,然后最好不要在numba中使用NumPy函数,因为这样会得到NumPy函数的所有缺点。然而,需要经验来了解<strong>何时应用numba,以及如何应用numba-很容易意外地编写一个非常慢的numba函数。在</p>
<blockquote>
<p>Do I hinder numba to fully optimize my code when using numpy, because numba is forced to use the numpy routines instead of finding an even more optimal way?</p>
</blockquote>
<p>是的。在</p>
<blockquote>
<p>I had hoped that numba would realise this and not use the numpy routines if it is non-beneficial.</p>
</blockquote>
<p>不,麻木现在不是这样工作的。Numba只是为LLVM创建代码来编译。也许这是numba将来的特色(谁知道呢)。目前,如果您自己编写循环和操作,并且避免在numba函数内部调用NumPy函数,numba的性能最好。在</p>
<p>有一些库使用表达式树并可能优化非有益的NumPy函数调用,但这些库通常不允许快速的手动迭代。例如,<code>numexpr</code>可以优化多个链式NumPy函数调用。目前,它要么是快速手动迭代(cython/numba)要么是使用表达式树(expression trees,numexpr)优化链式NumPy调用。也许在一个图书馆里连两个都不可能-我不知道。在</p>
<hr/>
<p>Numba和Cython在处理小数组和快速手动迭代时非常棒。NumPy/SciPy非常棒,因为它们有很多复杂的功能,可以在开箱即用的情况下完成各种任务。Numexpr非常适合链接多个NumPy函数调用。在某些情况下,Python比这些工具都快。在</p>
<p>以我的经验,如果你把不同的工具组合起来,你就可以充分利用它们。不要只局限于一种工具。在</p>