Python内存分析器绘图

时间:2017-08-07 14:15:49

标签: python plot memory-profiling

我正在尝试记录每个功能的内存消耗量。我使用的是memory_profiler软件包,我还得到了一个最终图表,其中包含了我的总内存消耗,但不是this nice tutorial

中描述的每个函数

我正在使用以下脚本test.py

import time
from memory_profiler import profile

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

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

#-------------------------------
def main():

    l1 = []
    l2 = []

    for i in range (5) :
        print "Iteration", i
        l1.append(test1())
        l2.append(test2())
        time.sleep(1)
        if i == 2 :
            del l1
            l1 = []

#-------------------------------
if __name__ == "__main__":
    main()

通过

运行
mprof run test.py

我得到了一些不错的输出,比如

Line #    Mem usage    Increment   Line Contents
================================================
11     46.2 MiB      0.0 MiB   @profile
12                             def test2():
13     53.8 MiB      7.6 MiB       a = [1] * (10 ** 6)
14    206.7 MiB    152.9 MiB       b = [2] * (2 * 10 ** 7)
15     53.8 MiB   -152.9 MiB       del b
16     53.8 MiB      0.0 MiB       return a

但是通过

绘制它
mprof plot

仅显示总内存消耗,而不是这些不错的讨论,显示链接中描述的不同功能的执行。有谁知道如何启用它?

enter image description here

2 个答案:

答案 0 :(得分:0)

您应该删除该行:

int

答案 1 :(得分:0)

我正在分析Django应用。这就是我的工作方式。

如@Lukic所示,从文件中删除from memory_profiler import profile。是的,您的编辑器会出现错误。是的,如果将其作为普通的python文件运行,则会出现错误。但是,如果使用mprof命令运行它,它将成功。使用以下命令运行Django:

mprof run --multiprocess --python python manage.py runserver --noreload

--multiprocess很重要,因为Django的最新版本甚至可能在开发服务器上启动多个进程。

--noreload很重要,否则Django将首先启动重新加载程序,然后再启动该实际实例(在@process装饰器中阻塞),将引发错误。

在一个单独的命令窗口中,我可以运行mprof plot并查看输出。但是,它没有任何功能注释。这是因为在Django服务器停止之前,注释不会写入mprof输出文件。服务器停止后,我可以运行mprof plot并查看整体内存利用率和函数运行时间。

希望这会有所帮助-我刚开始使用mprof时遇到了这个问题。

环境: Windows 10, Python 3.5, Django 1.11

参考:https://pypi.org/project/memory-profiler/(关于删除导入语句的注释很容易遗漏,并且没有很好地解释)