似乎numpy不是超快计算的最理想选择。有没有人知道在使用numpy进行数值计算时我们必须注意哪些开销?
答案 0 :(得分:12)
那么,取决于你想做什么。例如,对于对数值线性代数感兴趣的人来说,XOR几乎不相关(由于在下面使用优化的BLAS / LAPACK库,numpy非常快)。
一般来说,从numpy获得良好性能背后的一个重要思想是一次性分摊解释器在许多元素上的成本。换句话说,将循环从python代码(慢)移动到numpy / BLAS / LAPACK / etc中某处的C / Fortran循环中。内部(快)。如果您在该操作中成功(称为矢量化),性能通常会非常好。
当然,通过转储python解释器并使用C ++代替,显然可以获得更好的性能。这种方法是否真的成功取决于你使用C ++与numpy进行高性能编程有多好,以及你正在尝试做什么操作。
答案 1 :(得分:1)
每当你有一个像x = a * b + c / d + e
这样的表达式时,你最终得到一个a * b
临时数组,一个临时数组c / d
,一个用于一个总和,最后一个分配为了结果。这是Python类型和运算符重载的限制。但是,您可以使用扩充分配(*=
,+=
等)运营商明确地执行操作,并确保不会复制。
至于NumPy在该基准测试中执行速度较慢的具体原因,很难说,但它可能与检查Cython /等的大小,类型编组等的持续开销有关。不必担心。对于较大的问题,你可能会看到它越来越近了。
答案 2 :(得分:0)
我无法分辨,但我猜有两个因素:
也许numpy正在复制更多东西?当你避免分配大的临时数组时,weave通常会更快,但这在这里无关紧要。
numpy在迭代(可能)多维数组时使用了一些开销。这个开销通常会因数字运算而相形见绌,但是xor确实非常快,所以最重要的是开销。
答案 3 :(得分:0)
你的子问题:a = sin(x),有多少次往返。
诀窍是将一个numpy数组传递给sin(x),然后整个数组只有一个'往返',因为numpy会返回一个sin-values数组。此操作中没有涉及循环的python。