为什么numpy单独使用时会'慢'?

6 投票
4 回答
3625 浏览
提问于 2025-04-15 22:07

根据这个讨论

看起来,numpy在超快速计算方面并不是最理想的选择。有没有人知道在使用numpy进行数值计算时,我们需要注意哪些额外的开销呢?

4 个回答

0

我不太确定,但我猜有两个原因:

  1. 也许numpy在复制更多的东西?一般来说,使用weave会更快,特别是当你避免分配大的临时数组时,但在这里这应该不是主要问题。

  2. numpy在处理(可能是)多维数组时会有一些额外的开销。通常来说,这些开销在进行大量计算时是微不足道的,但因为异或运算真的非常快,所以这时候最重要的就是这些开销。

1

当你看到这样的表达式 x = a * b + c / d + e 时,实际上会产生几个临时的数组。首先会为 a * b 创建一个临时数组,然后为 c / d 再创建一个,接着为其中一个加法结果再创建一个,最后还会为最终结果再分配一个。这是因为Python的类型和运算符重载的限制。不过,你可以使用增强赋值运算符(比如 *=+= 等)来明确地在原地进行操作,这样就不会产生多余的复制。

至于NumPy在某些基准测试中表现得比较慢的具体原因,很难说清楚,但可能和它需要不断检查大小、类型转换等开销有关,而Cython等工具就不需要担心这些问题。在处理更大的问题时,你可能会发现它们的表现会更接近。

12

这要看你想做什么。如果你对数字线性代数感兴趣,XOR(异或运算)就没什么用处,因为numpy在这方面很快,因为它底层使用了优化过的BLAS/LAPACK库。

一般来说,想要让numpy运行得快,关键在于把解释器的开销分摊到一次处理多个元素上。换句话说,就是把Python代码里的循环(比较慢)转移到numpy、BLAS、LAPACK等内部的C或Fortran循环中(比较快)。如果你能做到这一点(叫做向量化),那么性能通常会很好。

当然,如果你直接放弃Python解释器,改用C++,性能可能会更好。不过,这种方法是否有效,取决于你在高性能编程方面的能力,以及你具体想做什么操作。

撰写回答