Python 检测内存使用量代码实例

去年时,自己写一个程序时,不太确定自己的内存使用量,就想找写工具来打印程序或函数的内存使用量。
这里将上次找到的内存检测工具的基本用法记录一下,今后分析Python程序内存使用量时也是需要的。这里推荐2个工具吧。

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.py
 
Line #    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的,不过没怎么维护了。

我在这里只是根据文档举了几个最简单的例子,更多信息,请阅读如下参考文档:

stackoverflow.com/questions/110259/which-python-memory-profiler-is-recommended
https://pypi.python.org/pypi/memory_profiler
https://pypi.python.org/pypi/psutil
http://guppy-pe.sourceforge.net/

时间: 2024-10-27 06:17:58

Python 检测内存使用量代码实例的相关文章

python单链表实现代码实例_python

链表的定义:链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就能够访问整个结点序列.也就是说,结点包含两部分信息:一部分用于存储数据元素的值,称为信息域:另一部分用于存储下一个数据元素地址的指针,称为指针域.链表中的第一个结点的地址存储在一个单独的结点中,称为头结点或首结点.链表中的最后一个结点没有后继元素,其指针域为空. python单链表实现代码: 复制代码

Python简单进程锁代码实例_python

先说说线程 在多线程中,为了保证共享资源的正确性,我们常常会用到线程同步技术. 将一些敏感操作变成原子操作,保证同一时刻多个线程中只有一个线程在执行这个原子操作. 我最常用的是互斥锁,也称独占锁.其次还有读写锁,信号量,条件变量等. 除此之外,我们在进程间通信时会用到信号,向某一个进程发送信号,该进程中设置信号处理函数,然后当该进程收到信号时,执行某些操作. 其实在线程中,也可以接受信号,利用这种机制,我们也可以用来实现线程同步.更多信息见 http://www.jb51.net/article

Python守护进程(daemon)代码实例_python

# -*-coding:utf-8-*- import sys, os '''将当前进程fork为一个守护进程 注意:如果你的守护进程是由inetd启动的,不要这样做!inetd完成了 所有需要做的事情,包括重定向标准文件描述符,需要做的事情只有 chdir() 和 umask()了 ''' def daemonize(stdin='/dev/null',stdout= '/dev/null', stderr= 'dev/null'): '''Fork当前进程为守护进程,重定向标准文件描述符 (

Python中类的继承代码实例_python

相对于C++的继承编写,Python更简洁,而且效率也是很高的,下面编写一个简单Python的继承例子. 复制代码 代码如下: #!/usr/bin/python   #filename: pyclass.py     class Member:           def __init__(self, name, age):                   self.name = name                   self.age = age                  

python获取糗百图片代码实例_python

复制代码 代码如下: from sgmllib import SGMLParserimport urllib2 class sgm(SGMLParser):    def reset(self):        SGMLParser.reset(self)        self.srcs=[]        self.ISTRUE=True     def start_div(self,artts):        for k,v in artts:            if v=="aut

Python实现高效求解素数代码实例

  这篇文章主要介绍了Python实现高效求解素数代码实例,本文直接给出代码实例,需要的朋友可以参考下 素数是编程中经常需要用到的. 作为学习Python的示例,下面是一个高效求解一个范围内的素数的程序,不需要使用除法或者求模运算. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #coding:utf-8 #设置python文件的编码为utf-8,这样就可以写入中文注释

Python urllib、urllib2、httplib抓取网页代码实例

  这篇文章主要介绍了Python urllib.urllib2.httplib抓取网页代码实例,本文直接给出demo代码,代码中包含详细注释,需要的朋友可以参考下 使用urllib2,太强大了 试了下用代理登陆拉取cookie,跳转抓图片...... 文档:http://docs.python.org/library/urllib2.html 直接上demo代码了 包括:直接拉取,使用Reuqest(post/get),使用代理,cookie,跳转处理 ? 1 2 3 4 5 6 7 8 9

AJAX应用实例之检测用户名是否唯一(实例代码)

先给大家展示下效果图,然后再给大家撸代码,效果图如下所示: 下面写一个简单的例子,检测用户名是否唯一(直接撸代码): 前端界面: <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transition

分享网页检测摇一摇实例代码_javascript技巧

废话不多说了,直接给大家贴代码了,具体代码如下所示: var Shaker = function(f){ // 摇一摇: 检测到3次摇动算一次摇一摇, 摇动后调用处理函数, 不再检测摇动 // f 摇动后的回调 this.callback = f; this.status = 0; // 0: 侦听未开始 1: 侦听开始 this.speed = 15; this.lastX = this.lastY = this.lastZ = 0; this.num = 0; // 检测触发次数 this.