zltzlt 发表于 2020-1-1 17:31:39

Python 小技巧 046:性能分析(三)—— memory_profiler

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 = * 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

图表:

_2_ 发表于 2020-1-1 19:16:31

沙发!

lijiachen 发表于 2020-7-12 18:29:07

{:10_257:}(又又是我)
页: [1]
查看完整版本: Python 小技巧 046:性能分析(三)—— memory_profiler