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 05 Python
利用python的socket发送http(s)请求方法示例
May 07 Python
使用Python3内置文档高效学习以及官方中文文档
May 19 Python
PyCharm安装Markdown插件的两种方法
Jun 24 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 Python
pytorch 模型可视化的例子
Aug 17 Python
Python with标签使用方法解析
Jan 17 Python
python十进制转二进制的详解
Feb 07 Python
调整Jupyter notebook的启动目录操作
Apr 10 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
May 16 Python
pytorch中[..., 0]的用法说明
May 20 Python
分享3个非常实用的 Python 模块
Mar 03 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生成UTF8文件的方法
2010/05/15 PHP
php数据入库前清理 注意php intval与mysql的int取值范围不同
2010/12/12 PHP
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
2012/07/31 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
php二维码生成
2015/10/19 PHP
PHP实现中国公民身份证号码有效性验证示例代码
2017/05/03 PHP
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
一些常用的JavaScript函数(json)附详细说明
2011/05/25 Javascript
JavaScript之自定义类型
2012/05/04 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
2016/12/14 Javascript
mockjs,json-server一起搭建前端通用的数据模拟框架教程
2017/12/18 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
2018/08/24 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
利用Python实现颜色色值转换的小工具
2016/10/27 Python
深入理解Python中range和xrange的区别
2017/11/26 Python
Python语言描述连续子数组的最大和
2018/01/04 Python
对python 判断数字是否小于0的方法详解
2019/01/26 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
python encrypt 实现AES加密的实例详解
2020/02/20 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
AVIS安飞士奥地利租车官网:提供奥地利、欧洲和全世界汽车租赁
2016/11/29 全球购物
输入N,打印N*N矩阵
2012/02/20 面试题
通用C#笔试题附答案
2016/11/26 面试题
毕业大学生自荐信
2014/06/17 职场文书
党员个人年度总结
2015/02/14 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书
SQLServer 日期函数大全(小结)
2021/04/08 SQL Server
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技
Android自定义scrollview实现回弹效果
2022/04/01 Java/Android