zl程序教程

您现在的位置是:首页 >  后端

当前栏目

2款Python内存检测工具介绍和使用方法

Python内存方法 使用 介绍 检测工具
2023-06-13 09:15:27 时间

去年自己写过一个程序时,不太确定自己的内存使用量,就想找写工具来打印程序或函数的内存使用量。
这里将上次找到的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):

复制代码代码如下:
#!/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

注意其中,要输出更多信息的.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.>
(后面省略了部分输出)

另外,还有一个叫“PySizer”的也是做memoryprofiling的,不过没怎么维护了。