重用现有的 numpy 数组还是创建一个新数组?

Mac*_*cer 5 python performance numpy

在迭代算法中,多次使用大型 numpy 数组是很常见的。我想将值填充到现有的大 numpy 数组中,但我发现创建一个新数组甚至更快。

\n\n
>>>import numpy as np\n>>>a=np.arange(10000)\n>>>b=a.copy()\n>>>%timeit b=a+a   # Every time create a new array\n100000 loops, best of 3: 9.59 \xc2\xb5s per loop\n>>>%timeit b[:]=a+a  # Use existing array\n100000 loops, best of 3: 13.3 \xc2\xb5s per loop\n>>>%timeit np.copyto(b,a+a)  # Another way to use existing array\n100000 loops, best of 3: 13.4 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 有没有更快的方法来重用现有的数组?(例如b上面)
  • \n
  • 如果没有这样的方法,为什么创建一个新数组会更快?
  • \n
  • 每次重新创建一个新数组有什么缺点吗?我对此犹豫不决,因为我的数据很大,我需要在每次迭代中为其分配不同的值。
  • \n
\n

Mac*_*cer 3

    \n
  • np.copyto(b,a);b+=a更快,但不是最快的方法。
  • \n
  • np.add(a,a,b)是目前最好的选择,100000 个循环,3 个中最好的:每个循环 8.66 \xc2\xb5s。
  • \n
\n\n

也许b[:]=a+a会生成一些临时计算空间?我不知道。但使用“+=、-=、*=、add”这些ufuns是不会错的。

\n