一、工具介绍

memory_profiler是Python的一个第三方库,其功能时基于函数的逐行代码分析工具。通过该库,可以对目标函数(允许分析多个函数)进行内存消耗分析,便于代码调优。pypi文档

二、安装

使用命令pip install memory_profiler进行安装。

三、分析结果注解

先放上这个工具的分析结果,各位朋友可以看一下是否满足自己的要求,再决定是否安装以及使用。
请添加图片描述
部分参数注解:

  • Mem usage:执行完改行代码后内存的使用情况。
  • Increment:执行完该行代码,内存增加了多少。
  • Occurrences:该行被命中多少次。
  • Line #:代码所在行号。
  • Line Contents:该行代码的内容。

四、使用

1、使用python命令进行分析

使用命令行模式进行分析又有两个小姿势。

(1)使用姿势1

在需要分析的函数前面增加@profile装饰器,在命令行使用python -m memory_profile <文件名>开始分析。

(2)示例1

示例代码如下

@profile()
def my_func():
    a = [1] * (10 ** 6)
    b = [2] * (2 * 10 ** 7)
    del b
    return a

if __name__ == "__main__":
    my_func()

分析结果如下
请添加图片描述

(3)该姿势的利弊1

优点

  • 使用方便,只需在待分析的函数前加装饰器@profile即可。
  • 用于分析的函数可以不在同一个文件内,方便分析较为复杂、调用方法较多的程序。

缺点

  • 因为需要在所有待分析的函数前都需要加装饰器,所以添加和删除的麻烦度与待分析的函数的数量成正比。
  • 因为@profile并不是第三方导入的,所以python <文件名>方式运行代码时会报错。
  • 同样是因为@profile不是第三方导入的,在IDEA中该段代码会有代码错误的红色波浪线提示,强迫症震怒。

(4)使用姿势2

代码里加入导包语句from memory_profiler import profile,在需要分析的函数前面增加@profile装饰器,在命令行使用python <文件名>开始分析。

(5)示例2

示例代码如下

from memory_profiler import profile

@profile(precision=5)
def my_func():
    a = [1] * (10 ** 6)
    b = [2] * (2 * 10 ** 7)
    del b
    return a

if __name__ == "__main__":
    my_func()

分析结果如下
请添加图片描述

(6)该姿势的利弊2

小姿势2的优缺点与小姿势1的优缺点基本相同,相同点此处不再赘述。
优点:

  • 因为在代码里显示加入了导包语句,所以@profile装饰器会被IDEA正常识别,且可以正常运行。
  • 小姿势2中可以在装饰器里增加precision参数,该参数的作用是指定分析结果的精准度。可以自行对比示例1与实例2的代码和结果。
    缺点:
  • 每个加上装饰器的文件都需要显示增加导包语句。
  • 代码里使用姿势2时,可以在命令行处使用姿势1来进行分析,但percision参数会被忽略。

2、使用mprof命令进行分析

这个姿势很强大,因为使用python命令执行代码只是查看的当前的内存情况,但mprof命令执行代码则会将分析结果+时间戳保存到.dat文件里,使用mprof命令+matplotlib包的组合,可以绘画出某一段时间内的内存使用情况;此外,mprof还可以在单进程、多进程、子进程等情况下进行内存分析。

(1)使用姿势

mprof run <executable>. # 单进程情况下统计内存情况。
mprof run --multiprocess <executable># 多进程情况下,跟踪统计每个子进程内存情况。其结果是主进程自己的数据 和 每个子进程自己的数据。
mprof run --include-children <executable># 多进程情况下,把所有子进程内存情况认为是主进程的内存情况,其统计数据只显示主进程(只不过主进程的数据是主进程内存+子进程)。
mprof run --include-children --multiprocess <executable>  # 多进程情况下,跟踪统计每个子进程的内存使用情况,同时把所有子进程的内存使用情况与主进程自己的内存使用情况相加。其统计结果是主进程自己的数据 和 每个子进程自己的数据 和 主进程+子进程。
mprof plot <.dat文件名>. # 查看图表

(2)该姿势的利弊

优点

  • 将内存使用情况与时间维度相结合,使得测试适用的情况更广。
  • 运行mprof命令后,.dat文件便会生成并且实时写入数据,此时我们可以在不停掉服务的情况下查看内存使用情况。
    缺点
  • 在不停止服务的情况下,只能看到主进程的内存数据,当停掉服务后才可以看到子进程的内存数据。

3、memory_profiler其他用法

memory_profiler除了逐行分析内存情况,还可以分析服务进程的内存使用情况以及内存采样等等,更多的骚操作可以阅读官方文档。
另附一大佬写的文章

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐