
tracemalloc 是 Python 内置的内存追踪模块,专用于统计对象分配的内存来源,能精准定位哪行代码、哪个函数占用了最多内存,特别适合排查内存泄漏或优化高内存消耗场景。
快速启动:启用 + 快照对比
只需三步就能看到内存热点:
- 调用 tracemalloc.start() 启动追踪(建议在程序开头或关键前调用)
- 在关注点(如处理前后、循环迭代中)调用 tracemalloc.take_snapshot() 获取快照
- 用 snapshot.compare_to() 或 snapshot.statistics('lineno') 查看差异或排序统计
示例:比较两次快照间新增的内存分配
import tracemalloc
tracemalloc.start()
<h1>... 执行一段可能吃内存的操作 ...</h1><p>snapshot1 = tracemalloc.take_snapshot()</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/00968c3c2c15" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Python免费学习笔记(深入)</a>”;</p><h1>... 再执行一次 ...</h1><p>snapshot2 = tracemalloc.take_snapshot()</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/ai/2410" title="遨虾"><img
src="https://img.php.cn/upload/ai_manual/001/246/273/176421356013932.png" alt="遨虾" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/ai/2410" title="遨虾">遨虾</a>
<p>1688推出的跨境电商AI智能体</p>
</div>
<a href="/ai/2410" title="遨虾" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><h1>查看新增分配最多的前10行</h1><p>top_stats = snapshot2.compare_to(snapshot1, 'lineno')
for stat in top_stats[:10]:
print(stat)
按文件/函数/行号聚合分析
statistics() 的 key_type 参数决定聚合维度:
- 'filename':按源文件汇总(适合快速定位问题模块)
- 'traceback':显示完整调用栈(适合深挖嵌套调用中的分配源头)
- 'lineno':精确到某行(最常用,直接定位问题代码行)
例如只看 data_loader.py 中内存占用最高的5处:
stats = snapshot.statistics('lineno')
data_loader_stats = [s for s in stats if 'data_loader.py' in s.traceback.format()[0]]
for s in data_loader_stats[:5]:
print(s)
过滤干扰项,聚焦真实问题
默认会记录所有分配(包括标准库、第三方包),容易淹没业务代码。可用 Filter 过滤:
- 排除特定路径:tracemalloc.Filter(False, '/path/to/venv/') (False 表示不追踪)
- 只追踪项目目录:tracemalloc.Filter(True, '/myproject/') (True 表示只追踪)
- 支持正则:tracemalloc.Filter(True, r'.*myapp.*\.py$')
启动时传入过滤器更干净:
tracemalloc.start(filters=[
tracemalloc.Filter(False, '/usr/'),
tracemalloc.Filter(False, 'site-packages'),
tracemalloc.Filter(True, './src/')
])
生产环境轻量使用技巧
tracemalloc 有开销,不适合长期全量开启。实用策略:
- 通过环境变量控制开关:if os.getenv('TRACE_MEMORY'): 再 start()
- 限制最大追踪帧数(降低开销):tracemalloc.start(25) (默认 1,数字越大越准但越慢)
- 定期 dump 快照到文件,离线分析:snapshot.dump('mem-20240501.snap'),再用 tracemalloc.Snapshot.load() 加载
- 结合 signal(如 SIGUSR1)动态触发快照,避免侵入主逻辑









