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中time模块与datetime模块在使用中的不同之处
Nov 24 Python
基于Python如何使用AIML搭建聊天机器人
Jan 27 Python
Python使用PIL模块生成随机验证码
Nov 21 Python
matplotlib绘制动画代码示例
Jan 02 Python
python matplotlib 注释文本箭头简单代码示例
Jan 08 Python
Python3 max()函数基础用法
Feb 19 Python
Python内置random模块生成随机数的方法
May 31 Python
如何解决tensorflow恢复模型的特定值时出错
Feb 06 Python
Python中的With语句的使用及原理
Jul 29 Python
python利用google翻译方法实例(翻译字幕文件)
Sep 21 Python
python判断all函数输出结果是否为true的方法
Dec 03 Python
OpenCV-Python实现人脸磨皮算法
Jun 07 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
JpGraph php柱状图使用介绍
2011/08/23 PHP
php连接mssql的一些相关经验及注意事项
2013/02/05 PHP
使用CodeIgniter的类库做图片上传
2014/06/12 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
ThinkPHP3.2.3实现分页的方法详解
2016/06/03 PHP
php+mysql实现简单登录注册修改密码网页
2016/11/30 PHP
PHP批斗大会之缺失的异常详解
2019/07/09 PHP
JQuery 实现的页面滚动时浮动窗口控件
2009/07/10 Javascript
THREE.JS入门教程(4)创建粒子系统
2013/01/24 Javascript
jqGrid随窗口大小变化自适应大小的示例代码
2013/12/28 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
详细分析使用AngularJS编程中提交表单的方式
2015/06/19 Javascript
JQuery的attr 与 val区别
2016/06/12 Javascript
浅谈键盘上回车按钮的js触发事件
2017/02/13 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
jQuery基于cookie实现换肤功能实例
2017/10/14 jQuery
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
JavaScript闭包相关知识解析
2019/10/19 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
2020/02/07 Javascript
[01:24]DOTA2上海特锦赛OG战队抵达 专车接机入驻总统套房
2016/02/23 DOTA
Python字符编码判断方法分析
2016/07/01 Python
用tensorflow实现弹性网络回归算法
2018/01/09 Python
Python logging设置和logger解析
2019/08/28 Python
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
银行介绍信范文
2014/01/10 职场文书
应用数学专业求职信
2014/03/14 职场文书
企业年会主持词
2014/03/27 职场文书
医院合作协议书
2014/08/19 职场文书
九寨沟导游词
2015/02/02 职场文书
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
2021/05/25 MySQL
Python的这些库,你知道多少?
2021/06/09 Python
Java基础之详解HashSet的使用方法
2021/06/30 Java/Android