为什么float32与float64类型数据的峰值内存占用相同?
问题原因分析
- 核心诱因是float32测试代码中冗余的
arr = arr.astype(np.float32)调用:numpy的astype方法默认会生成全新的数组副本,哪怕转换前后的dtype完全相同,也会申请新的内存空间存储转换结果。 - 执行该语句时,内存中会同时存在两份长度为1亿的float32数组:还未被垃圾回收的原
np.zeros生成的数组、刚通过astype创建的新数组,两者各占400MB,总占用刚好800MB,因此被tracemalloc统计为运行峰值。 - 语句执行完成后,原数组没有变量引用会被自动回收,所以最终打印的当前内存占用为预期的400MB,和float64的当前占用拉开差距。
测试结果截图:
验证方案
把float32测试代码中冗余的astype行删除,重新运行即可看到峰值内存降到400MB左右,符合float32的理论内存占用。
修正后的float32测试代码如下:
import tracemalloc import numpy as np tracemalloc.start() arr = np.zeros((100000000,), dtype=np.float32) for i in range(100000000): arr[i] = i current, peak = tracemalloc.get_traced_memory() tracemalloc.stop() print(f"Current memory usage is {current / 10**6}MB; Peak was {peak / 10**6}MB")
内容的提问来源于stack exchange,提问作者Leo hk
相关产品推荐
相关产品推荐

