Numpy NDarray与Tensor的内存开销对比及测量方法咨询
NumPy ndarray 与 Tensor 内存开销分析
问题背景
因需存储大型数组用于后续处理,需明确NumPy ndarray和Tensor的内存开销情况,但查找资料未获有效信息,Medium文章也不够详实。
测试结果与疑问
Tensor 测试结果
测试代码及输出:
<tf.Tensor: shape=(3, 3), dtype=int32, numpy= array([[1, 2, 3], [1, 2, 3], [1, 2, 3]], dtype=int32)> In [66]: sys.getsizeof(ts1) Out[66]: 168 In [67]: ts Out[67]: <tf.Tensor: shape=(3, 3), dtype=int64, numpy= array([[1, 2, 3], [1, 2, 3], [1, 2, 3]])> In [68]: sys.getsizeof(ts) Out[68]: 168
疑问:无论数据类型是int32还是int64,Tensor的sys.getsizeof结果均为168字节,无法体现实际数据的内存差异。
NumPy ndarray 测试结果
测试代码及输出:
In [52]: nmpy = np.array([[1,2,3],[1,2,3],[1,2,3]], dtype = "int32") In [53]: sys.getsizeof(nmpy) Out[53]: 156 In [54]: nmpy1 = np.array([[1,2,3],[1,2,3],[1,2,3]], dtype = "int64") In [55]: sys.getsizeof(nmpy1) Out[55]: 192
计算分析:
- 3×3×int32数据占用:36字节,156-36=120字节(额外开销)
- 3×3×int64数据占用:72字节,192-72=120字节(额外开销)
疑问:这120字节的额外开销具体存储了什么?推测可能是指向NumPy属性(如内部长度等)的指针,但不确定。
解答与说明
关于 Tensor 的 sys.getsizeof 结果
sys.getsizeof返回的是Tensor对象本身在Python堆中的内存大小,而Tensor的实际数据通常存储在GPU内存或独立的内存缓冲区中,并非直接存在Python对象里。所以不管dtype如何,你看到的168字节只是Tensor这个Python包装对象的大小,不是实际数据的内存占用。
要正确测量Tensor的实际数据内存,应该使用tf.Tensor.nbytes,这个属性会返回实际数据的字节数。比如你的int32 3x3 tensor,ts1.nbytes会返回36;int64的则返回72。
关于 NumPy ndarray 的额外120字节开销
NumPy ndarray的额外开销是其内部元数据的存储,具体包含:
- 数组的维度(shape)、数据类型(dtype)、步长(strides)信息
- 指向实际数据缓冲区的指针
- 引用计数、标志位(比如是否为只读、是否是视图等)
- 其他内部管理信息
这些元数据的大小在不同平台和NumPy版本中可能略有差异,但120字节是典型64位系统下的开销,你的推测是正确的——这些就是维护数组结构和属性所需的核心数据。
测量内存开销的方法总结
NumPy ndarray
sys.getsizeof(arr):返回对象+元数据+数据的总大小arr.nbytes:仅返回实际数据的字节数- 额外开销 =
sys.getsizeof(arr)-arr.nbytes
TensorFlow Tensor
sys.getsizeof(tensor):仅返回Python包装对象的大小,无实际数据参考价值tensor.nbytes:返回实际数据的字节数- 如果要查看GPU内存占用,可使用
tf.config.experimental.get_memory_info('GPU:0')(需GPU环境)
内容的提问来源于stack exchange,提问作者Phuy Kong
相关产品推荐
相关产品推荐

