Python 如何准确查看程序内存占用情况

Felix
Felix
发布时间:2026-10-12 | 2人浏览过
原创

在Python开发中,精准掌握程序内存占用有助于排查泄漏与优化性能。本文通过 psutil 和 memory_profiler 两个核心工具,演示如何获取单进程的实时内存消耗、操作系统总内存状态,以及如何逐行分析函数级的内存增量变化。配合标准代码示例与终端指令,帮助开发者快速建立内存监控流程。

准备环境与基础工具

监控 Python 程序内存主要依赖两个轻量级第三方库:psutil 用于获取当前进程及操作系统的内存视图,memory_profiler 用于精细化到每一行代码的内存分配记录。若需重现文中的矩阵运算测试案例,建议同时安装 numpy。

pip install psutil memory_profiler numpy

逐行分析代码内存变化

当需要定位具体某段逻辑为何吃掉大量内存时,memory_profiler 是最直观的工具。它可以通过装饰器自动拦截函数执行,并在控制台输出每行代码带来的内存增减量。

第1步:编写带分析标记的测试脚本

打开文本编辑器,新建脚本文件(如 mem_test.py)。在目标函数顶部添加 @profile 装饰器,引入必要的系统模块进行前后内存值对比与手动垃圾回收验证:

import numpy as np
import os
import psutil
import gc
from memory_profiler import profile

@profile
def test_memory():
    # 创建一个较大的二维数组,观察内存突增
    a = np.full(shape=(600, 700), fill_value=99.0)
    return a

if __name__ == '__main__':
    obj = test_memory()
    # 打印当前进程的实际物理内存占用(RSS),单位MB
    print('A:%.2f MB' % (psutil.Process(os.getpid()).memory_info().rss / 1024 / 1024))

    del obj
    gc.collect()  # 强制触发垃圾回收,确保内存正确释放
    print('B:%.2f MB' % (psutil.Process(os.getpid()).memory_info().rss / 1024 / 1024))

第2步:通过终端运行并查看详细报告

保存脚本后,不要直接在 IDE 内部运行(部分集成环境会拦截分析器的标准输出)。在项目根目录打开终端,执行标准模块调用命令:

python -m memory_profiler mem_test.py

终端将按列输出详细的分析报表。表头依次代表:行号、当前累计内存(MiB)、该行导致的增量(MiB)以及执行次数。执行完毕后,脚本底部会打印您自定义的前后对比结果:

A:56.83 MB
B:53.83 MB

可见数据块被销毁且 GC 执行后,常驻内存稳定回落,证明内存分配机制正常。若发现某一行增量异常偏高,即可针对性进行数据结构重构或分块处理。

实时监控当前进程与系统内存

除了单函数剖析,开发者常需在长运行服务中定期打印资源水位。psutil 提供了一致跨平台的接口来查询虚拟内存池分布。

第1步:获取操作系统总内存信息

调用 virtual_memory() 可直接拉取宿主机的完整内存画像,包含总量、可用量、已用百分比及交换空间状态。这在容器化部署或云服务器调优时极为常用。

第2步:绑定当前 PID 查看独立开销

结合 Process(os.getpid()) 可锁定当前脚本自身的物理内存峰值。以下是一段可直接复用的监控封装逻辑:

import psutil
import os

info = psutil.virtual_memory()
print(f'当前程序已分配内存:{psutil.Process(os.getpid()).memory_info().rss} Bytes')
print(f'系统总内存:{info.total} Bytes')
print(f'系统内存整体占比:{info.percent}%')
print(f'CPU 核心数:{psutil.cpu_count()}')

在实际业务中,可将上述 print 语句替换为日志记录组件,设定固定频率轮询。当 rss 数值呈单调递增且不随任务结束下降时,通常意味着存在引用未释放或闭包缓存导致的内存泄漏。

完成判断与排错建议

成功建立监控后,可通过以下特征确认工具生效:
- 终端输出出现清晰的 Line # Mem Usage Increment 表格;
- 手动删除大对象并调用 gc.collect() 后,RSS 数值回归基线;
- 系统级查询返回的百分比与任务管理器/系统监视器显示一致。

若遇到 ModuleNotFoundError,请检查是否在当前 Python 虚拟环境中执行了安装命令。对于高并发 Web 服务,建议在压测阶段同步开启此监控模块,避免生产环境因突发流量导致 OOM(Out Of Memory)崩溃。

以上就是 Python 查看程序内存占用情况的详细内容,更多关于 Python 性能优化与资源监控的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表