马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
Python 性能分析 —— memory_profiler
memory_profiler 与 line_profiler 相似,区别是 line_profiler 用于分析程序的用时(时间),而 memory_profiler 用于分析程序的占用内存(空间)。
1. 安装
直接使用 pip 安装即可:
pip install memory_profiler
2. 使用
demo.py 文件内容如下:
# -*- coding: utf-8 -*-
from memory_profiler import profile
@profile
def demo():
a = [1] * 1000
b = [2] * 1000000
c = [3] * 500
c.extend(a)
a.extend(b)
b *= 2
demo()
切换到 demo.py 所在目录,cmd 执行命令:
python -m memory_profiler demo.py
打印了以下内容:
Filename: demo.py
Line # Mem usage Increment Line Contents
================================================
6 38.7 MiB 38.7 MiB @profile
7 def demo():
8 38.7 MiB 0.0 MiB a = [1] * 1000
9 46.3 MiB 7.6 MiB b = [2] * 1000000
10 46.3 MiB 0.0 MiB c = [3] * 500
11 46.3 MiB 0.0 MiB c.extend(a)
12 53.9 MiB 7.6 MiB a.extend(b)
13 61.6 MiB 7.6 MiB b *= 2
其中:
- Filename 表示分析的文件名。
- Line # 表示行号。
- Mem usage 表示本行运行的内存占用量。
- Increment 表示当前行的内存相对于上一行增长了多少。
- Line Content 表示每一行的内容。
- 1 MiB 约等于 1.05 MB。
3. 参数
- precision
precision 用于指定显示内存占用量小数点的位数。默认小数点后显示一位,如果某行代码占用内存比较小,就可能显示不出来。此时可以通过调整小数点后的位数实现。
demo.py 文件内容如下:
# -*- coding: utf-8 -*-
from memory_profiler import profile
@profile(precision=4)
def demo():
a = [1] * 1000
b = [2] * 1000000
c = [3] * 500
c.extend(a)
a.extend(b)
b *= 2
demo()
执行结果:
Filename: demo.py
Line # Mem usage Increment Line Contents
================================================
6 38.6758 MiB 38.6758 MiB @profile(precision=4)
7 def demo():
8 38.6758 MiB 0.0000 MiB a = [1] * 1000
9 46.3086 MiB 7.6328 MiB b = [2] * 1000000
10 46.3086 MiB 0.0000 MiB c = [3] * 500
11 46.3086 MiB 0.0000 MiB c.extend(a)
12 53.9492 MiB 7.6406 MiB a.extend(b)
13 61.5820 MiB 7.6328 MiB b *= 2
- stream
stream 用于指定输出结果的流。每次运行都要打印内存情况,势必会影响程序输出效果,我们可以将结果输出到文件流中。
demo.py 文件内容如下:
# -*- coding: utf-8 -*-
from memory_profiler import profile
@profile(precision=4, stream=open("E:/demo.txt", "w"))
def demo():
a = [1] * 1000
b = [2] * 1000000
c = [3] * 500
c.extend(a)
a.extend(b)
b *= 2
demo()
执行后 E:\demo.txt 内容如下:
Filename: demo.py
Line # Mem usage Increment Line Contents
================================================
6 38.8672 MiB 38.8672 MiB @profile(precision=4, stream=open("E:/demo.txt", "w"))
7 def demo():
8 38.8672 MiB 0.0000 MiB a = [1] * 1000
9 46.5000 MiB 7.6328 MiB b = [2] * 1000000
10 46.5000 MiB 0.0000 MiB c = [3] * 500
11 46.5000 MiB 0.0000 MiB c.extend(a)
12 54.1406 MiB 7.6406 MiB a.extend(b)
13 61.7734 MiB 7.6328 MiB b *= 2
4. mprof 命令
memory_profiler 自带 mprof 命令。
Usage: mprof <command> <options> <arguments>
Available commands:
run 运行给定的命令或 python 文件
rm 删除 mprof 生成的给定文件
clean 清除当前目录中 mprof 创建的文件
list 显示带索引的现有配置文件
plot 可以将 mprof run 的结果生成图片
Type mprof <command> --help for usage help on a specific command.
For example, mprof plot --help will list all plotting options.
说说 plot 参数。run 命令可以生成 .dat 文件,plot 可以将根据该文件生成图片,不过需要安装 matplotlib 包。
例子:
E:\Programming\Python\项目>mprof run demo.py
mprof: Sampling memory every 0.1s
running as a Python program...
Filename: demo.py
Line # Mem usage Increment Line Contents
================================================
6 38.6836 MiB 38.6836 MiB @profile(precision=4)
7 def demo():
8 38.6836 MiB 0.0000 MiB a = [1] * 1000
9 46.3164 MiB 7.6328 MiB b = [2] * 1000000
10 46.3164 MiB 0.0000 MiB c = [3] * 500
11 46.3164 MiB 0.0000 MiB c.extend(a)
12 53.9570 MiB 7.6406 MiB a.extend(b)
13 61.5898 MiB 7.6328 MiB b *= 2
E:\Programming\Python\项目>mprof list
0 mprofile_20200101172926.dat 17:29:26 01/01/2020
E:\Programming\Python\项目>mprof plot mprofile_20200101172926.dat
图表:
|