分享
为什么问答平台  ›  专栏  ›  技术社区  ›  leon

为什么麻木本身就是“慢”? - Why numpy is 'slow' by itself?

  •  6
  • leon  · 技术社区  · 2 月前

    鉴于 thread here

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

    4 回复  |  直到 6 年前
        1
  •  12
  •   janneb    9 年前

    好吧,这取决于你想做什么。例如,XOR与那些对数字线性代数感兴趣的人几乎没有关系(因为下面使用了优化的blas/lapack库,所以numpy非常快)。

    通常,从numpy获得良好性能背后的一个重要想法是将解释器的成本分摊到许多元素上。换句话说,将循环从python代码(slow)移动到numpy/blas/lapack/etc.内部(fast)的C/Fortran循环中。如果您成功地完成了这个操作(称为矢量化),那么性能通常会非常好。

    当然,您可以通过抛出Python解释器和使用C++来获得更好的性能。这种方法是否真正成功与否取决于你用C++与NoMPY的高性能编程有多好,以及你到底想做什么操作。

        2
  •  1
  •   dwf    9 年前

    任何时候你有这样的表情 x = a * b + c / d + e ,最后得到一个临时数组 a * b ,一个临时数组用于 c / d ,一个用于其中一个和,最后一个用于结果的分配。这是对python类型和运算符重载的限制。但是,您可以使用增强的分配显式地在适当的位置执行操作。( *= , += 等)操作员,并确保没有复印件。

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

        3
  •  0
  •   wisty    9 年前

    我不知道,但我想有两个因素:

    1. 也许麻木是在复制更多的东西?当您避免分配大型临时数组时,编织通常更快,但这在这里并不重要。

    2. numpy在迭代多维数组(可能)时使用了一些开销。这个开销通常比数字运算要小,但是XOR非常快,所以真正重要的是开销。

        4
  •  0
  •   roadrunner66    6 年前

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

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