为什么NumPy本身运行速度较慢?

6

根据此帖,看起来numpy不是进行超快计算的最理想选择。有人知道在使用numpy进行数值计算时需要注意哪些开销吗?

4个回答

12

这要看你想做什么。例如,对于想做数值线性代数的人来说,异或(XOR)基本上没有什么用处(对此,numpy使用了优化的BLAS/LAPACK库,因此非常快速)。

通常,从numpy获取良好性能的大致思路是将解释器的成本分摊到许多元素上。换句话说,将循环从Python代码(慢)移动到numpy/BLAS/LAPACK等内部的C/Fortran循环中(快)。如果你成功地进行了向量化操作(称为矢量化),性能通常会非常好。

当然,你可以通过放弃Python解释器并改用C ++ 等语言来获得更好的性能。这种方法的成功与否取决于你在C++高性能编程方面的能力以及你正在尝试执行哪些操作。


我同意一旦数据传递到Fortran端,速度会很快。但我更感兴趣的是Python /编译代码接口开销。例如,在代码中写下 a = sin(x) , 数据需要从Python到C再返回,我想知道它经历了多少层开销,如果将其移植到Cython是否会有更好的表现。 - leon

1

每当你有一个像 x = a * b + c / d + e 这样的表达式时,你最终会得到一个临时数组用于 a * b,一个临时数组用于 c / d,一个用于其中一个和的临时数组,最后还有一个结果的分配。这是 Python 类型和运算符重载的限制。但是,你可以使用增强赋值 (*=, += 等) 运算符明确地进行原地操作,并确保不会产生副本。

至于 NumPy 在该基准测试中执行更慢的具体原因,很难说,但可能与检查大小、类型编组等常量开销有关,而 Cython/等则不必担心这些问题。在更大的问题上,你可能会看到它变得更接近。


0

我不能确定,但我猜测有两个因素:

  1. 也许numpy正在复制更多的东西?当您避免分配大型临时数组时,weave通常更快,但这在这里不应该有影响。

  2. numpy在迭代(可能)多维数组时具有一定的开销。这种开销通常会被数值计算所掩盖,但是异或运算真的非常快,因此真正重要的是开销。


0
你的子问题:a = sin(x),需要多少往返。
诀窍是将numpy数组传递给sin(x),然后整个数组只有一次“往返”操作,因为numpy会返回一个sin值数组。这个操作中没有涉及到python的循环语句。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接