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的条件语句与运算符优先级详解
Oct 13 Python
使用Python中的tkinter模块作图的方法
Feb 07 Python
Python中index()和seek()的用法(详解)
Apr 27 Python
Python只用40行代码编写的计算器实例
May 10 Python
Python实现操纵控制windows注册表的方法分析
May 24 Python
在VS2017中用C#调用python脚本的实现
Jul 31 Python
Python如何输出警告信息
Jul 30 Python
浅析python中的del用法
Sep 02 Python
python实现测试工具(二)——简单的ui测试工具
Oct 19 Python
python实现一个简单RPC框架的示例
Oct 28 Python
python 根据列表批量下载网易云音乐的免费音乐
Dec 03 Python
python基于openpyxl生成excel文件
Dec 23 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语法(1)
2006/10/09 PHP
解析php安全性问题中的:Null 字符问题
2013/06/21 PHP
PHP变量内存分配问题记录整理
2013/11/27 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
php过滤表单提交的html等危险代码
2014/11/03 PHP
WHOOPS PHP调试库的使用
2017/09/29 PHP
javascript setTimeout和setInterval 的区别
2009/12/08 Javascript
js字符串的各种格式的转换 ToString,Format
2011/08/08 Javascript
js模拟select下拉菜单控件的代码
2013/05/08 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
jquery点击改变class并toggle的实现代码
2016/05/15 Javascript
JSONP原理及简单实现
2016/06/08 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
微信 jssdk 签名错误invalid signature的解决方法
2019/01/14 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
微信小程序云开发详细教程
2019/05/16 Javascript
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
Python中暂存上传图片的方法
2015/02/18 Python
Python编程实现蚁群算法详解
2017/11/13 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
Python time库基本使用方法分析
2019/12/13 Python
scrapy实践之翻页爬取的实现
2021/01/05 Python
西班牙网上书店:Casa del Libro
2016/11/01 全球购物
美发店5.1活动方案
2014/01/24 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
《大自然的语言》教学反思
2014/04/08 职场文书
学生操行评语大全
2014/04/24 职场文书
花坛标语大全
2014/06/30 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
自查自纠工作总结
2014/10/15 职场文书
2014年小学数学工作总结
2014/12/12 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
导游词书写之黄山
2019/08/06 职场文书
如何基于python实现单目三维重建详解
2022/06/25 Python