运算的内存开销
前⾯例⼦⾥我们对每个操作新开内存来储存它的结果。例如即使是 y = x + y 我们也会新创建
内存,然后再将 y 指向新内存。为了展⽰这⼀点,我们可以使⽤ Python ⾃带的 id 函数:如果两
个实例的 ID ⼀致,那么它们所对应的内存地址相同;反之则不同。
In [24]: before = id(y)
y = y + x
id(y) == before
Out[24]: False
如果我们想指定结果到特定内存,我们可以使⽤前⾯介绍的索引来进替换操作。在下⾯的例⼦中,
我们先通过 zeros_like 创建和 y 形状相同且元素为 0 的 NDArray,记为 z。接下来,我们把 x
+ y 的结果通过 [:] 写进 z 所对应的内存中。
In [25]: z = y.zeros_like()
before = id(z)
z[:] = x + y
id(z) == before
Out[25]: True
注意到这⾥我们还是为 x + y 创建了临时内存来存储计算结果,再复制到 z 所对应的内存。如
果想避免这个内存开销,我们可以使⽤运算符的全名函数中的 out 参数。
In [26]: nd.elemwise_add(x, y, out=z)
id(z) == before
Out[26]: True
如果现有的 NDArray 的值在之后的程序中不会复⽤,我们也可以⽤ x[:] = x + y 或者 x +=
y 来减少运算的内存开销。
复制
a = nd.arange(4)
b = a
b[1] = 33
a
[ 0. 33. 2. 3.]
所以,在NDArray中一般的赋值语句像y = x,y实际上只是x的一个别名而已,x和y是共享一份数据存储空间的。如果要不一样,得用copy
y = x.copy()