有时你只需要临时的数组,你不能重写
x[1:-1] += 5*x[2:]
作为视图上的操作。
当您需要临时数组时,模拟就地计算是创建一些临时数组并将它们用于计算的每个阶段的输出。您仍然有更多的指针数学,但您不必多次在内存中创建空间。然后您可以将上面的行重写为:
np.multiply(x[2:], 5, out=temp)
x[1:-1] += temp
在这里,我假设temp
它的大小x[-1:1]
是我通常为处理边界这个常见问题所做的。
通过就地计算,您无法多次使用 timeit 运行精确方程,因为数字呈指数增长,但这是一个将 5x 替换为 1x 的测试:
import numpy as np
from timeit import timeit
N = 100000000
x = np.arange(N, dtype=np.int)
temp = np.zeros((N-2,), dtype=np.int)
def f0(x, temp):
x[1:-1] += 1*x[2:]
def f1(x, temp):
np.multiply(x[1:-1], 1, out=temp)
x[1:-1] += temp
print timeit("f0(x, temp)", "from __main__ import f0, f1, x, temp", number=100)
print timeit("f1(x, temp)", "from __main__ import f0, f1, x, temp", number=100)
这使:
71.543628931
44.719383955
# or, for N /= 100, and number *= 10
5.37844896317
4.50015997887
对于更小的阵列,out
阵列方法可能会变得更慢。