• 节省内存的方法
    对某元素的算数操作可以直接在原内存上修改,但实现这种操作的前提是,该元素在内存中只被引用一次。
    简单的逻辑上的计算操作,会导致内存地址的变化,比如,如下代码中的x = x + yx的内存地址会发生变化:
1
2
3
4
5
6
import torch
x = torch.randn(3)
y = 2
print(id(x))
x = x + y
print(id(x))

输出:

1
2
2347673029520
2347679960912

x += y则不会改变x的内存地址:

1
2
3
4
5
x = torch.randn(3)
y = 2
print(id(x))
x = x + y
print(id(x))

输出:

1
2
2347673029520
2347673029520

注意:这种方法只适用于不需要求导的数据,即required_grad=False的数据。

  • 浅拷贝与深拷贝
    即torch clone 与 直接赋值 的区别。直接赋值是浅拷贝,clone是深拷贝;浅拷贝变化会影响原始数据,深拷贝不会。
1
2
3
4
5
6
A = torch.randn(3, 3)
B = A.clone()
print('id(A):', id(A))
print('id(B):', id(B))
C = A
print('id(C):', id(C))

输出:

1
2
3
id(A): 2347686617808
id(B): 2347686428304
id(C): 2347686617808