运算的内存开销
在前面的例子中,我们为每个操作新开内存来存储它的结果。举个例子,假设x和y都是NDArray,在执行y = x + y操作后, y所对应的内存地址将变成为存储x + y计算结果而新开内存的地址。为了展示这一点,我们可以使用Python自带的id函数:如果两个实例的ID一致,它们所对应的内存地址相同;反之则不同。
In [20]:
x=nd.ones((3,4))y=nd.ones((3,4))before=id(y)y=y+xid(y)==before
Out[20]:
False
在下面的例子中,我们先通过nd.zeros_like(y)创建和y形状相同且元素为0的NDArray,记为z。接下来,我们把x + y的结果通过[:]写进z所对应的内存中。
In [21]:
z=nd.zeros_like(y)before=id(z)z[:]=x+yid(z)==before
Out[21]:
True
然而,这里我们还是为x + y创建了临时内存来存储计算结果,再复制到z所对应的内存。为了避免这个内存开销,我们可以使用运算符的全名函数中的out参数。
In [22]:
nd.elemwise_add(x,y,out=z)id(z)==before
Out[22]:
True
如果现有的NDArray的值在之后的程序中不会复用,我们也可以用 x[:] = x + y 或者 x += y来减少运算的内存开销。
In [23]:
before=id(x)x+=yid(x)==before
Out[23]:
True
网友评论