Python 小技巧 046:性能分析(三)—— memory_profiler
Python 性能分析 —— memory_profilermemory_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 = * 1000
b = * 1000000
c = * 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 = * 1000
9 46.3 MiB 7.6 MiB b = * 1000000
10 46.3 MiB 0.0 MiB c = * 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 = * 1000
b = * 1000000
c = * 500
c.extend(a)
a.extend(b)
b *= 2
demo()
执行结果:
Filename: demo.py
Line # Mem usage Increment Line Contents
================================================
638.6758 MiB38.6758 MiB @profile(precision=4)
7 def demo():
838.6758 MiB 0.0000 MiB a = * 1000
946.3086 MiB 7.6328 MiB b = * 1000000
1046.3086 MiB 0.0000 MiB c = * 500
1146.3086 MiB 0.0000 MiB c.extend(a)
1253.9492 MiB 7.6406 MiB a.extend(b)
1361.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 = * 1000
b = * 1000000
c = * 500
c.extend(a)
a.extend(b)
b *= 2
demo()
执行后 E:\demo.txt 内容如下:
Filename: demo.py
Line # Mem usage Increment Line Contents
================================================
638.8672 MiB38.8672 MiB @profile(precision=4, stream=open("E:/demo.txt", "w"))
7 def demo():
838.8672 MiB 0.0000 MiB a = * 1000
946.5000 MiB 7.6328 MiB b = * 1000000
1046.5000 MiB 0.0000 MiB c = * 500
1146.5000 MiB 0.0000 MiB c.extend(a)
1254.1406 MiB 7.6406 MiB a.extend(b)
1361.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
================================================
638.6836 MiB38.6836 MiB @profile(precision=4)
7 def demo():
838.6836 MiB 0.0000 MiB a = * 1000
946.3164 MiB 7.6328 MiB b = * 1000000
1046.3164 MiB 0.0000 MiB c = * 500
1146.3164 MiB 0.0000 MiB c.extend(a)
1253.9570 MiB 7.6406 MiB a.extend(b)
1361.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
图表:
沙发! {:10_257:}(又又是我)
页:
[1]