我正在尝试记录每个功能的内存消耗量。我使用的是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
仅显示总内存消耗,而不是这些不错的讨论,显示链接中描述的不同功能的执行。有谁知道如何启用它?
答案 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/(关于删除导入语句的注释很容易遗漏,并且没有很好地解释)