使用memory_profiler监测python代码运行时内存消耗

前几天一直在寻找能够输出python函数运行时最大内存消耗的方式,看了一堆的博客和知乎,也尝试了很多方法,最后选择使用memory_profiler中的mprof功能来进行测量的,它的原理是在代码运行过程中每0.1S统计一次内存,并生成统计图。

具体的使用方式如下:

首先安装memory_profiler和psutil(psutil主要用于提高memory_profile的性能,建议安装)(可使用pip直接安装)
pip install memory_profiler
pip install psutil

具体运行方式为如下:(在待检测代码所在目录中打开命令行运行如下代码)

mprof run test.py
结果会生成一个.dat文件,如”mprofile_20160716170529.dat”,里面记录了内存随时间的变化
mprof plot
使用该命令以图片的形式展示出来

如果在运行的时候出现如下的gbk解码错误,解决方案是首先进入 memory_profiler.py文件中,找到第1131行,
把with open(filename) as f: 更改成 with open(filename, encoding=’utf-8’) as f:!!!

UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xad in position 337: illegal multibyte sequence


这里写图片描述

值得注意的是,尽管网上大部分都说在待检测的函数之前加上@profile修饰器,但是不知道为何我在anaconda python3.6的环境里始终加不上这个修饰器,强行加上就报错,没加上也没问题。

### 如何在 PyCharm 中监控代码运行内存使用情况 为了有效监测 Python 应用程序在开发环境中的性能表现,特别是内存消耗状况,在 PyCharm 集成开发环境中提供了多种工具和技术来帮助开发者完成这项工作。 #### 使用内置调试器和分析器功能 PyCharm 自带了一个强大的调试器,可以设置断点并逐步执行代码。当遇到复杂的逻辑或者怀疑存在泄漏的地方,可以在这些位置暂停程序,并通过查看变量的状态以及调用堆栈的信息来进行初步排查[^1]。 对于更深入地了解应用程序的整体资源占用情况,则推荐利用 PyCharm 的 Profiler 工具。此特性允许用户启动专门用于性能剖析的任务,它不仅能够展示 CPU 间分布图谱,还支持追踪对象分配历史记录,从而直观反映出哪些部分占用了过多内存[^2]。 #### 安装第三方库辅助检测 除了依赖 IDE 内建的功能之外,还可以借助一些外部软件包增强对应用内部运作机制的理解程度。例如 `memory_profiler` 就是一个非常受欢迎的选择之一: 安装命令如下所示: ```bash pip install memory-profiler ``` 之后便可在目标函数前加上装饰器 @profile 或者直接修改配置文件以激活该模块的工作模式。这样做的好处是可以获得更加精细粒度的数据报告,有助于定位具体哪一行代码引发了异常增长的趋势[^3]。 另外值得注意的是,如果项目规模较大且结构复杂的话,考虑引入像 `objgraph` 这样的可视化图形化界面也可能有所帮助;它可以清晰呈现当前进程里存在的各种实例之间的关系网状图,便于识别潜在的风险源。 #### 实现自定义日志输出方案 最后一种方法就是自行编写简单的脚本来定期打印出重要刻下的 heap size 变动趋势作为补充手段。这通常涉及到导入 sys 和 gc 模块获取相关信息片段,再配合 time.sleep() 函数控制采样频率即可达成目的。 ```python import os, psutil def get_memory_usage(): process = psutil.Process(os.getpid()) mem_info = process.memory_info() return mem_info.rss / (1024 * 1024) if __name__ == "__main__": print(f"Memory used: {get_memory_usage()} MB") ``` 上述代码展示了如何计算当前进程中已使用的物理内存量(单位为兆字节),将其嵌入到业务流程的关键节点处可方便后续审查人员快速掌握整体动态变化规律。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值