You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:54:05