Python内存使用追踪:不同库计算结果差异显著的原因
为什么不同Python内存分析库的结果差异这么大?
测试代码:
def my_function(): my_list = [i for i in range(1_000_000)] return my_list my_list = my_function()
不同库的内存统计结果:
- memory_profiler:82MB
- tracemalloc:36MB
- psutil:3MB
差异的核心原因是每个库统计的内存范围和计算逻辑完全不同:
1. memory_profiler:统计进程整体物理内存开销
memory_profiler 基于进程的**常驻集大小(RSS)**计算内存变化,统计范围最广,包含:
- Python解释器本身占用的内存
- 已加载的系统库、第三方库内存
- 所有Python对象(列表结构、列表内的整数对象等)占用的内存
- 进程共享的部分内存(如系统库的共享页)
它的数值代表整个Python进程实际占用的物理内存总量,因此结果最大。
2. tracemalloc:仅统计Python解释器分配的对象内存
tracemalloc是Python标准库自带的工具,只聚焦Python解释器主动分配的内存块,排除了系统级开销,比如:
- Python解释器本身的内存
- 系统库的内存
对于这个例子,它统计的是列表结构内存加上每个整数对象的内存(64位系统下单个小int对象约占28字节,百万个就是28MB左右,加上列表结构总和接近36MB)。
3. psutil:取决于具体测量的内存指标
psutil是多功能系统监控库,支持多种内存统计维度。你得到的3MB应该是测量了进程私有内存的增量中,仅列表结构占用的部分——因为Python会缓存0到256的小整数,列表里的整数对象是提前存在的,不需要新分配内存,新增的只有列表存储指针的数组(受内存对齐、Python内存分配器优化影响,实际增量接近3MB)。如果用psutil测量RSS,结果会和memory_profiler接近。
内容的提问来源于stack exchange,提问作者Shrinidhi M
相关产品推荐
相关产品推荐

