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 相关文章推荐
利用Psyco提升Python运行速度
Dec 24 Python
Python实现登录接口的示例代码
Jul 21 Python
详解flask表单提交的两种方式
Jul 21 Python
selenium+python自动化测试之页面元素定位
Jan 23 Python
python中pytest收集用例规则与运行指定用例详解
Jun 27 Python
Python-Seaborn热图绘制的实现方法
Jul 15 Python
python中的TCP(传输控制协议)用法实例分析
Nov 15 Python
python 实现单通道转3通道
Dec 03 Python
深入浅析python的第三方库pandas
Feb 13 Python
python飞机大战游戏实例讲解
Dec 04 Python
python爬虫如何解决图片验证码
Feb 14 Python
Python 实现定积分与二重定积分的操作
May 26 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
重量级动漫纷纷停播!唯独OVERLORD第四季正在英魂之刃继续更新
2020/05/06 日漫
PHP base64+gzinflate压缩编码和解码代码
2008/10/03 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
jQuery 动态酷效果实现总结
2009/12/27 Javascript
JavaScript prototype属性深入介绍
2012/11/27 Javascript
原生javascript和jquery判断浏览器版本等信息
2013/07/04 Javascript
appendChild() 或 insertBefore()使用与区别介绍
2013/10/11 Javascript
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
Javascript中replace()小结
2015/09/30 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
Angularjs---项目搭建图文教程
2016/07/08 Javascript
基于Vue如何封装分页组件
2016/12/16 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
es6数值的扩展方法
2019/03/11 Javascript
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
[47:35]VP vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
利用Opencv中Houghline方法实现直线检测
2018/02/11 Python
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
django2笔记之路由path语法的实现
2019/07/17 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
2020/02/28 Python
解决json中ensure_ascii=False的问题
2020/04/03 Python
python openCV实现摄像头获取人脸图片
2020/08/20 Python
Python通过递归函数输出嵌套列表元素
2020/10/15 Python
canvas如何实现多张图片编辑的图片编辑器
2020/03/10 HTML / CSS
党员干部廉洁承诺书
2014/05/28 职场文书
私人委托书格式
2014/09/10 职场文书
2014年预算员工作总结
2014/12/05 职场文书
sqlserver2017共享功能目录路径不可改的解决方法
2021/04/16 SQL Server
Python办公自动化PPT批量转换操作
2021/09/15 Python