根据此帖,看起来numpy不是进行超快计算的最理想选择。有人知道在使用numpy进行数值计算时需要注意哪些开销吗?
这要看你想做什么。例如,对于想做数值线性代数的人来说,异或(XOR)基本上没有什么用处(对此,numpy使用了优化的BLAS/LAPACK库,因此非常快速)。
通常,从numpy获取良好性能的大致思路是将解释器的成本分摊到许多元素上。换句话说,将循环从Python代码(慢)移动到numpy/BLAS/LAPACK等内部的C/Fortran循环中(快)。如果你成功地进行了向量化操作(称为矢量化),性能通常会非常好。
当然,你可以通过放弃Python解释器并改用C ++ 等语言来获得更好的性能。这种方法的成功与否取决于你在C++高性能编程方面的能力以及你正在尝试执行哪些操作。
每当你有一个像 x = a * b + c / d + e
这样的表达式时,你最终会得到一个临时数组用于 a * b
,一个临时数组用于 c / d
,一个用于其中一个和的临时数组,最后还有一个结果的分配。这是 Python 类型和运算符重载的限制。但是,你可以使用增强赋值 (*=
, +=
等) 运算符明确地进行原地操作,并确保不会产生副本。
至于 NumPy 在该基准测试中执行更慢的具体原因,很难说,但可能与检查大小、类型编组等常量开销有关,而 Cython/等则不必担心这些问题。在更大的问题上,你可能会看到它变得更接近。
我不能确定,但我猜测有两个因素:
也许numpy正在复制更多的东西?当您避免分配大型临时数组时,weave通常更快,但这在这里不应该有影响。
numpy在迭代(可能)多维数组时具有一定的开销。这种开销通常会被数值计算所掩盖,但是异或运算真的非常快,因此真正重要的是开销。
a = sin(x)
, 数据需要从Python到C再返回,我想知道它经历了多少层开销,如果将其移植到Cython是否会有更好的表现。 - leon