2款Python内存检测工具介绍和使用方法
去年自己写过一个程序时,不太确定自己的内存使用量,就想找写工具来打印程序或函数的内存使用量。
这里将上次找到的2个内存检测工具的基本用法记录一下,今后分析Python程序内存使用量时也是需要的。
memory_profiler模块(与psutil一起使用)
注:psutil这模块,我太喜欢了,它实现了很多Linux命令的主要功能,如:ps,top,lsof,netstat,ifconfig,who,df,kill,free等等。
示例代码(https://github.com/smilejay/python/blob/master/py2014/mem_profile.py):
#!/usr/bin/envpython
"""
CreatedonMay31,2014
@author:Jay<smile665@gmail.com>
@description:usememory_profilermoduleforprofilingprograms/functions.
"""
frommemory_profilerimportprofile
frommemory_profilerimportmemory_usage
importtime
@profile
defmy_func():
a=[1]*(10**6)
b=[2]*(2*10**7)
delb
returna
defcur_python_mem():
mem_usage=memory_usage(-1,interval=0.2,timeout=1)
returnmem_usage
deff(a,n=100):
time.sleep(1)
b=[a]*n
time.sleep(1)
returnb
if__name__=="__main__":
a=my_func()
printcur_python_mem()
print""
printmemory_usage((f,(1,),{"n":int(1e6)}),interval=0.5)
运行上面的代码,输出结果为:
jay@Jay-Air:~/workspace/python.git/py2014$pythonmem_profile.py
Filename:mem_profile.py
Line# Memusage Increment LineContents
================================================
15 8.0MiB 0.0MiB @profile
16 defmy_func():
17 15.6MiB 7.6MiB a=[1]*(10**6)
18 168.2MiB 152.6MiB b=[2]*(2*10**7)
19 15.6MiB -152.6MiB delb
20 15.6MiB 0.0MiB returna
[15.61328125,15.6171875,15.6171875,15.6171875,15.6171875]
[15.97265625,16.00390625,16.00390625,17.0546875,23.63671875,23.63671875,23.640625]
Guppy(使用了Heapy)
GuppyisanumbrellapackagecombiningHeapyandGSLwithsupportutilitiessuchastheGluemodulethatkeepsthingstogether.
示例代码(https://github.com/smilejay/python/blob/master/py2014/try_guppy.py):
注意其中,要输出更多信息的.more用法。 另外,还有一个叫“PySizer”的也是做memoryprofiling的,不过没怎么维护了。
#!/usr/bin/envpython
"""
CreatedonMay31,2014
@author:Jay<smile665@gmail.com>
@description:justtrytouseGuppy-PE(useingHeapy)formemoryprofiling.
"""
fromguppyimporthpy
a=[8]*(10**6)
h=hpy()
printh.heap()
printh.heap().more
printh.heap().more.more
运行上面的程序,输出结果为:
jay@Jay-Air:~/workspace/python.git/py2014$pythontry_guppy.py
Partitionofasetof26963objects.Totalsize=11557848bytes.
Index Count % Size %Cumulative %Kind(class/dictofclass)
0 177 1 8151560 71 8151560 71list
1 12056 45 996840 9 9148400 79str
2 5999 22 488232 4 9636632 83tuple
3 324 1 283104 2 9919736 86dict(noowner)
4 68 0 216416 2 10136152 88dictofmodule
5 199 1 210856 2 10347008 90dictoftype
6 1646 6 210688 2 10557696 91types.CodeType
7 1610 6 193200 2 10750896 93function
8 199 1 177008 2 10927904 95type
9 124 0 135328 1 11063232 96dictofclass
<91morerows.Typee.g."_.more"toview.>
Index Count % Size %Cumulative %Kind(class/dictofclass)
10 1045 4 83600 1 11148456 96__builtin__.wrapper_descriptor
11 109 0 69688 1 11218144 97dictofguppy.etc.Glue.Interface
12 389 1 34232 0 11252376 97__builtin__.weakref
13 427 2 30744 0 11283120 97types.BuiltinFunctionType
14 411 2 29592 0 11312712 98__builtin__.method_descriptor
15 25 0 26200 0 11338912 98dictofguppy.etc.Glue.Share
16 108 0 25056 0 11363968 98__builtin__.set
17 818 3 19632 0 11383600 98int
18 66 0 18480 0 11402080 98dictofguppy.etc.Glue.Owner
19 16 0 17536 0 11419616 99dictofabc.ABCMeta
<81morerows.Typee.g."_.more"toview.>
(后面省略了部分输出)
相关文章