如何查看Python解释器自身的内存消耗
Python解释器自身内存消耗的测量实现
为什么memory-profiler无法满足测量需求
该工具的核心统计逻辑是绑定到被装饰的函数、命令行指定的待测代码块,从代码块执行的时刻才开始计算内存增量,无法覆盖解释器启动、初始化运行环境、加载内置模块这些阶段的基底内存占用,因此没法拿到解释器自身的全量内存消耗值。
基于tracemalloc的可落地实现
tracemalloc作为Python内置标准库模块,完全可以匹配测量需求:它支持在解释器启动的早期阶段开启内存跟踪,能够精准区分解释器运行环境本身的内存开销、和业务代码执行产生的增量内存占用。
具体实现操作要点:
- 将
tracemalloc的跟踪启动逻辑放在脚本的最顶端,也就是所有第三方库导入、业务逻辑执行之前的位置,让跟踪起点对齐解释器基础初始化完成的节点 - 在跟踪启动的第一时间捕获内存快照,读取的快照内存值就是解释器自身的基础内存消耗
- 如果需要排除业务代码的内存干扰,可以通过快照对比的方式,单独剥离出解释器运行相关的内存块统计值
对应的示例代码:
# 以下代码必须放在脚本最顶部,在任何第三方库导入、业务代码逻辑之前运行 import tracemalloc # 启动内存跟踪 tracemalloc.start() # 捕获初始内存快照 initial_snapshot = tracemalloc.take_snapshot() # 统计解释器基础内存占用 total_baseline = sum(stat.size for stat in initial_snapshot.statistics('lineno')) # 转换为MB单位输出 print(f"当前Python解释器自身内存消耗: {total_baseline / 1024 / 1024:.2f} MB")
测量注意事项:
- 如果需要测量纯解释器(无额外第三方库加载)的内存值,不要在tracemalloc启动后执行任何额外的导入、逻辑操作,直接读取初始快照值即可
- 如果需要测量加载完所有项目依赖后、执行业务逻辑前的解释器内存,就把初始快照的捕获位置调整到所有import语句完成、第一行业务逻辑开始之前即可
tracemalloc统计的是Python运行时层面申请的内存,如果需要获取操作系统视角下的解释器进程总常驻内存,可以在同节点调用系统进程查询接口,获取包含C扩展底层申请内存在内的全量进程内存值做交叉验证。
内容的提问来源于stack exchange,提问作者Альберт Александров
相关产品推荐
相关产品推荐

