运行一些操作可能会导致为新结果分配内存。例如,我们用 Y=X+Y
,我们将取消引用Y指向的张量,而是指向新分配的内存处的张量。
before = id(Y)
Y = Y + X
id(Y) == before # 输出是False
这可能是不可取的,原因有两个:
1、首先,我们不想总是不必要地分配内存。在机器学习中,我们可能有数百兆的参数,并且在一秒内多次更新所有参数。通常情况下,我们希望原地执行这些更新;
2、如果我们不原地更新,其他引用仍然会指向旧的内存位置,这样我们的某些代码可能会无意中引用旧的参数。
执行原地操作:使用 X[:] = X + Y
或 X+=Y
,减少操作的内存开销。
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X + Y # 用 [:] 选择数组X中的所有元素,然后将这些元素替换为 X+Y 的结果
print('id(Z):', id(Z))
before = id(X)
X += Y
id(X) == before