NumPy数组转PyTorch及TensorFlow张量的转换机制与内存清理问题
NumPy数组转PyTorch/TensorFlow张量的实现逻辑与内存清理方案
1. 转换时的内存机制:共享还是拷贝?
1.1 PyTorch
默认使用torch.from_numpy()转换时,生成的张量和原NumPy数组共享底层内存,不会生成完整副本,属于原地关联机制,修改其中任意一个的值,另一个会同步变更。
只有以下场景会生成独立副本:
- 原NumPy数组的dtype不属于PyTorch支持的原生数值类型
- 原NumPy数组的内存排布不连续
- 你显式调用
torch.tensor()(注意该接口默认做深拷贝,和torch.from_numpy()行为完全不同)或者.clone()方法
示例代码:
import numpy as np import torch arr = np.array([1,2,3]) t = torch.from_numpy(arr) arr[0] = 100 print(t) # 输出 tensor([100, 2, 3]),验证内存共享
1.2 TensorFlow
默认使用tf.convert_to_tensor()转换时,绝大多数场景会生成独立的内存副本,不和原NumPy数组共享内存。
仅存在一种实验性的共享场景:运行在CPU设备上、原NumPy数组dtype是TensorFlow支持的原生类型、且使用tf.experimental.numpy模块的接口转换,该特性不建议在生产环境依赖。
示例代码:
import numpy as np import tensorflow as tf arr = np.array([1,2,3]) t = tf.convert_to_tensor(arr) arr[0] = 100 print(t) # 输出 tf.Tensor([1 2 3], shape=(3,), dtype=int64),验证内存不共享
2. 原NumPy数组的内存清理方法
分两种场景处理:
- 非共享内存场景(TensorFlow默认转换、PyTorch用
torch.tensor()转换):直接删除原数组变量引用即可,Python垃圾回收机制会自动释放内存,操作为del arr,如果处理大数组需要立刻回收,可以主动调用gc.collect()触发垃圾回收。 - 共享内存场景(PyTorch用
torch.from_numpy()转换):仅删除原数组变量不会释放底层内存,因为关联的张量还持有这块内存的引用,需要同时删除原数组变量和对应的张量变量,内存才会被回收。
注意:不要手动强制释放NumPy数组的底层内存,否则正在使用关联张量的进程会直接触发段错误。
内容的提问来源于stack exchange,提问作者Ru11
相关产品推荐
相关产品推荐

