tensor加法存在的问题
[[pytorch:张量(tenser)]]
问题阐述
python的实现逻辑和内存回收机制挺奇怪的。实际上,当使用tensor类型的时候,其更像是存储了一个指针:
- 创建变量的时候,先申请分配内存,然后再将变量指向其存储tensor的位置
- 计算的时候,实际上是不是将其对应的值赋予过去,而是将位置赋予过去。
这就导致了一个问题:
1 | before = id(x) |
输出:false
实际上,计算x+y的时候,系统先申请了一个内存空间,然后将计算结果放在这个空间内,最后将 x存储的位置改为这个内存空间的地址……
所有的变量都是存储在内存中的,如果x释放出来的内存没有被及时释放,这样就会带来很大的内存占用冗余,而这在本就对内存占用需求比较大的深度学习来说是致命的。
解决办法
所以说可以换一种写法,就可以使得其代码效率优化:
1 | z[:] = x + y |
这样的话,相当于将值进行了复写,而不是重复申请更换空间。而x+y产生的临时内存占用将会被赋值完之后被释放。
如果说,我们知道后面x中存储的数据不再会被使用了,也可以使用下面的写法:
1 | x += y |