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

如何按内存大小排序tracemalloc统计结果,定位高内存占用代码?

如何让tracemalloc的统计结果按内存大小排序?

我用tracemalloc分析内存占用的代码如下:

def print_statistics(s: Snapshot, s2: Snapshot):
    stats = s2.compare_to(s, 'lineno')
    for stat in stats[:20]:
        print(stat)

def some_func():
    tracemalloc.start(50)
    s = tracemalloc.take_snapshot()
    # 业务代码
    s2 = tracemalloc.take_snapshot()
    print_statistics(s, s2)

得到的输出示例:

/usr/local/lib/python3.8/json/decoder.py:353: size=2672 B (+2672 B), count=33 (+33), average=81 B
/usr/local/lib/python3.8/site-packages/prometheus_client/values.py:15: size=1664 B (+1664 B), count=32 (+32), average=52 B
/usr/local/lib/python3.8/site-packages/prometheus_client/metrics.py:521: size=1304 B (+1304 B), count=17 (+17), average=77 B
/usr/local/lib/python3.8/site-packages/prometheus_client/values.py:16: size=1152 B (+1152 B), count=32 (+32), average=36 B
/usr/local/lib/python3.8/tracemalloc.py:185: size=13.2 KiB (+5328 B), count=281 (+111), average=48 B
/usr/local/lib/python3.8/json/decoder.py:353: size=5344 B (-2672 B), count=66 (-33), average=81 B
/usr/local/lib/python3.8/tracemalloc.py:102: size=5891 B (+2366 B), count=37 (+16), average=159 B

我发现输出顺序混乱,没有按规则排序,请问怎么调整才能按内存大小排序统计结果,定位到占用内存最多的代码部分?


解决方法

tracemalloc的compare_to方法返回的统计结果默认排序规则并非按内存增量或总大小,你需要手动对结果进行排序:

1. 按内存增量降序排序

修改print_statistics函数,在遍历前调用stats.sort(),指定排序依据为内存变化量(stat.size_diff),并设置降序,这样内存增加最多的条目会排在最前面:

def print_statistics(s: Snapshot, s2: Snapshot):
    stats = s2.compare_to(s, 'lineno')
    # 按内存增量从大到小排序
    stats.sort(key=lambda stat: stat.size_diff, reverse=True)
    for stat in stats[:20]:
        print(stat)

2. 按总内存大小降序排序

如果需要关注当前快照的总内存占用情况,改用stat.size作为排序key:

def print_statistics(s: Snapshot, s2: Snapshot):
    stats = s2.compare_to(s, 'lineno')
    # 按总内存大小从大到小排序
    stats.sort(key=lambda stat: stat.size, reverse=True)
    for stat in stats[:20]:
        print(stat)

关键参数说明

  • stat.size_diff:两个快照之间的内存变化量,正数表示内存增加,负数表示内存释放
  • reverse=True:确保大内存占用的条目优先显示,便于快速定位内存热点代码

内容的提问来源于stack exchange,提问作者Ema Il

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:57:16