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


Posted in Python onJune 01, 2014

去年自己写过一个程序时,不太确定自己的内存使用量,就想找写工具来打印程序或函数的内存使用量。
这里将上次找到的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/env python'''
Created on May 31, 2014
@author: Jay <smile665@gmail.com>
@description: use memory_profiler module for profiling programs/functions.
'''
from memory_profiler import profile
from memory_profiler import memory_usage
import time
 
@profile
def my_func():
    a = [1] * (10 ** 6)
    b = [2] * (2 * 10 ** 7)
    del b
    return a
 
def cur_python_mem():
    mem_usage = memory_usage(-1, interval=0.2, timeout=1)
    return mem_usage
 
def f(a, n=100):
    time.sleep(1)
    b = [a] * n
    time.sleep(1)
    return b
if __name__ == '__main__':
    a = my_func()
    print cur_python_mem()
    print ""
    print memory_usage((f, (1,), {'n': int(1e6)}), interval=0.5)

运行上面的代码,输出结果为:

jay@Jay-Air:~/workspace/python.git/py2014 $python mem_profile.py
Filename: mem_profile.pyLine #    Mem usage    Increment   Line Contents
================================================
    15      8.0 MiB      0.0 MiB   @profile
    16                             def my_func():
    17     15.6 MiB      7.6 MiB       a = [1] * (10 ** 6)
    18    168.2 MiB    152.6 MiB       b = [2] * (2 * 10 ** 7)
    19     15.6 MiB   -152.6 MiB       del b
    20     15.6 MiB      0.0 MiB       return a
 
[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)
Guppy is an umbrella package combining Heapy and GSL with support utilities such as the Glue module that keeps things together.
示例代码(https://github.com/smilejay/python/blob/master/py2014/try_guppy.py):

#!/usr/bin/env python'''
Created on May 31, 2014
@author: Jay <smile665@gmail.com>
@description: just try to use Guppy-PE (useing Heapy) for memory profiling.
'''
 
from guppy import hpy
a = [8] * (10 ** 6)
h = hpy()
print h.heap()
print h.heap().more
print h.heap().more.more

注意其中,要输出更多信息的.more用法。
运行上面的程序,输出结果为:

jay@Jay-Air:~/workspace/python.git/py2014 $python try_guppy.py
Partition of a set of 26963 objects. Total size = 11557848 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0    177   1  8151560  71   8151560  71 list
     1  12056  45   996840   9   9148400  79 str
     2   5999  22   488232   4   9636632  83 tuple
     3    324   1   283104   2   9919736  86 dict (no owner)
     4     68   0   216416   2  10136152  88 dict of module
     5    199   1   210856   2  10347008  90 dict of type
     6   1646   6   210688   2  10557696  91 types.CodeType
     7   1610   6   193200   2  10750896  93 function
     8    199   1   177008   2  10927904  95 type
     9    124   0   135328   1  11063232  96 dict of class
<91 more rows. Type e.g. '_.more' to view.>
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
    10   1045   4    83600   1  11148456  96 __builtin__.wrapper_descriptor
    11    109   0    69688   1  11218144  97 dict of guppy.etc.Glue.Interface
    12    389   1    34232   0  11252376  97 __builtin__.weakref
    13    427   2    30744   0  11283120  97 types.BuiltinFunctionType
    14    411   2    29592   0  11312712  98 __builtin__.method_descriptor
    15     25   0    26200   0  11338912  98 dict of guppy.etc.Glue.Share
    16    108   0    25056   0  11363968  98 __builtin__.set
    17    818   3    19632   0  11383600  98 int
    18     66   0    18480   0  11402080  98 dict of guppy.etc.Glue.Owner
    19     16   0    17536   0  11419616  99 dict of abc.ABCMeta
<81 more rows. Type e.g. '_.more' to view.>
(后面省略了部分输出)

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

Python 相关文章推荐
python 生成目录树及显示文件大小的代码
Jul 23 Python
Python面向对象之类和对象实例详解
Dec 10 Python
使用pandas实现csv/excel sheet互相转换的方法
Dec 10 Python
Django Rest framework之权限的实现示例
Dec 17 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 Python
在django中实现页面倒数几秒后自动跳转的例子
Aug 16 Python
python opencv实现证件照换底功能
Aug 19 Python
Python线程指南分享
Nov 19 Python
python小程序之4名牌手洗牌发牌问题解析
May 15 Python
Python字符串split及rsplit方法原理详解
Jun 29 Python
python定义类的简单用法
Jul 24 Python
python使用列表的最佳方案
Aug 12 Python
使用Python的Supervisor进行进程监控以及自动启动
May 29 #Python
python应用程序在windows下不出现cmd窗口的办法
May 29 #Python
python正则表达式re模块详细介绍
May 29 #Python
在python中的socket模块使用代理实例
May 29 #Python
python中stdout输出不缓存的设置方法
May 29 #Python
python两种遍历字典(dict)的方法比较
May 29 #Python
python中常用的各种数据库操作模块和连接实例
May 29 #Python
You might like
PHP缓存技术的使用说明
2011/08/06 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
php采集内容中带有图片地址的远程图片并保存的方法
2015/01/03 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
jQuery 1.0.2
2006/10/11 Javascript
JQuery 常用操作代码
2010/03/14 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
JS自调用匿名函数具体实现
2014/02/11 Javascript
屏蔽相应键盘按钮操作
2014/03/10 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
Javascript中的Prototype到底是什么
2016/02/16 Javascript
node.js express安装及示例网站搭建方法(分享)
2016/08/22 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
微信小程序之选项卡的实现方法
2017/09/29 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
2017/12/20 Javascript
JavaScript实现短暂提示框功能
2018/04/04 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
微信小程序实现动态列表项的顺序加载动画
2019/07/25 Javascript
基于VUE的v-charts的曲线显示功能
2019/10/01 Javascript
详解JavaScript之ES5的继承
2020/07/08 Javascript
Element Rate 评分的使用方法
2020/07/27 Javascript
原生js实现弹幕效果
2020/11/29 Javascript
简单了解OpenCV是个什么东西
2017/11/10 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
Python实现端口检测的方法
2018/07/24 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
服装厂厂长岗位职责
2013/12/27 职场文书
遗嘱继承公证书
2014/04/09 职场文书
离婚协议书范文2014
2014/10/16 职场文书
2014年学生会工作总结
2014/11/07 职场文书
决心书格式范文
2015/09/23 职场文书
研究生学习计划书应该怎么写?
2019/09/10 职场文书