Python 为什么numpy是';慢';独自一人?

Python 为什么numpy是';慢';独自一人?,python,performance,numpy,scientific-computing,Python,Performance,Numpy,Scientific Computing,鉴于 似乎numpy并不是最理想的超快计算。有人知道当使用numpy进行数值计算时,我们必须注意哪些开销吗?嗯,这取决于您想做什么。例如,XOR对于那些对数值线性代数感兴趣的人来说几乎没有什么意义(对于数值线性代数,numpy非常快,因为它下面使用了优化的BLAS/LAPACK库) 一般来说,从numpy获得良好性能背后的大想法是将解释器的成本一次分摊到多个元素上。换句话说,将循环从python代码(慢速)移动到numpy/BLAS/LAPACK/etc.内部(fast)中的某个地方的C/For

鉴于


似乎numpy并不是最理想的超快计算。有人知道当使用numpy进行数值计算时,我们必须注意哪些开销吗?

嗯,这取决于您想做什么。例如,XOR对于那些对数值线性代数感兴趣的人来说几乎没有什么意义(对于数值线性代数,numpy非常快,因为它下面使用了优化的BLAS/LAPACK库)

一般来说,从numpy获得良好性能背后的大想法是将解释器的成本一次分摊到多个元素上。换句话说,将循环从python代码(慢速)移动到numpy/BLAS/LAPACK/etc.内部(fast)中的某个地方的C/Fortran循环中。如果您成功地完成了该操作(称为矢量化),性能通常会非常好


当然,通过抛出Python解释器,使用C++,显然可以获得更好的性能。这种方法是否成功取决于你在C++与NoPy的高性能编程中的好坏,以及你到底想做什么操作。

我不能真正地说出来,但我想有两个因素:

  • 也许numpy在复制更多的东西?避免分配大的临时数组时,weave通常会更快,但这在这里并不重要

  • numpy在迭代(可能)多维数组时会有一些开销。这种开销通常比数字运算要小,但异或运算速度非常快,所以真正重要的是开销


  • 任何时候,当你有一个像
    x=a*b+c/d+e
    这样的表达式时,你最终会得到一个用于
    a*b
    的临时数组,一个用于
    c/d
    的临时数组,一个用于一个和,最后一个用于结果的分配。这是Python类型和运算符重载的限制。但是,您可以使用增广赋值(
    *=
    +=
    等)操作符显式地在适当的位置执行操作,并确保不会进行复制


    至于NumPy在该基准测试中执行较慢的具体原因,很难说,但这可能与Cython/etc不必担心的检查大小、类型封送等的持续开销有关。在更大的问题上,你可能会看到它越来越近。

    你的子问题:a=sin(x),有多少往返


    诀窍是将numpy数组传递给sin(x),那么整个数组只有一个“往返”,因为numpy将返回sin值数组。这个操作没有涉及python for循环。

    我同意,一旦数据被传递到fortran端,它就很快了。我对python/编译代码接口开销更感兴趣。假设行
    a=sin(x)
    数据经历了从python到C的往返过程。我想知道它经历了多少层开销,如果将其移植到cython会做得更好。