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中的__new__()方法的使用
Apr 09 Python
在Django中同时使用多个配置文件的方法
Jul 22 Python
python WindowsError的错误代码详解
Jul 23 Python
python获取程序执行文件路径的方法(推荐)
Apr 26 Python
python Spyder界面无法打开的解决方法
Apr 27 Python
由面试题加深对Django的认识理解
Jul 19 Python
python3文件复制、延迟文件复制任务的实现方法
Sep 02 Python
python中wx模块的具体使用方法
May 15 Python
通俗易懂了解Python装饰器原理
Sep 17 Python
Python进行特征提取的示例代码
Oct 15 Python
Python通过len函数返回对象长度
Oct 22 Python
Python实现简单的俄罗斯方块游戏
Sep 25 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和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
js防止表单重复提交实现代码
2012/09/05 Javascript
node.js中的fs.readlink方法使用说明
2014/12/17 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
2015/06/05 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
Nodejs高扩展性的模板引擎 functmpl简介
2017/02/13 NodeJs
JS图片预加载插件详解
2017/06/21 Javascript
BootStrap实现文件上传并带有进度条效果
2017/09/11 Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
2018/02/03 Javascript
小程序双头slider选择器的实现示例
2020/03/31 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
Vue实现简单的拖拽效果
2020/08/25 Javascript
python获取指定路径下所有指定后缀文件的方法
2015/05/26 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
2019/02/27 Python
python解压zip包中文乱码解决方法
2020/11/27 Python
基础的CSS3弹性盒Flexbox布局使用实例
2016/04/08 HTML / CSS
美国高级工作服品牌:Carhartt
2018/01/25 全球购物
应征英语教师求职信
2013/11/27 职场文书
优秀求职自荐信怎样写
2013/12/18 职场文书
社区交通安全实施方案
2014/03/22 职场文书
奥巴马获胜演讲稿
2014/05/15 职场文书
化工专业自荐书
2014/06/16 职场文书
小学一年级数学教学计划
2015/01/20 职场文书
出生公证书
2015/01/23 职场文书
《月光曲》教学反思
2016/02/16 职场文书
2019求职信大礼包
2019/05/15 职场文书
Rust 连接 PostgreSQL 数据库的详细过程
2022/01/22 PostgreSQL
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers