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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:15:22