python memory usage_2款Python内存检测工具介绍和使用方法

本文介绍了如何使用Python的memory_profiler模块和Guppy(包括Heapy)工具来分析程序的内存使用情况。通过示例代码展示了如何在Python程序中集成这两个工具,并解释了它们的输出结果,帮助理解程序运行时的内存占用情况。
摘要由CSDN通过智能技术生成

去年自己写过一个程序时,不太确定自己的内存使用量,就想找写工具来打印程序或函数的内存使用量。

这里将上次找到的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

@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

@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的,不过没怎么维护了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python程序的内存使用情况可以使用Python内置的`memory_profiler`模块进行监视。`memory_profiler`可以帮助我们分析Python程序的内存使用情况,找出内存泄漏等问题。 安装`memory_profiler`模块: ```python pip install memory_profiler ``` 使用`memory_profiler`监视Python程序的内存使用情况: 1. 在需要监视的函数上添加`@profile`装饰器。 2. 运行程序时加上`-m memory_profiler`参数,并指定要监视的文件名。 例如,我们有以下Python程序: ```python from random import randint @profile def generate_list(): nums = [randint(0, 100) for _ in range(1000000)] return nums if __name__ == '__main__': nums = generate_list() print(sum(nums)) ``` 我们可以在`generate_list()`函数上加上`@profile`装饰器,然后运行以下命令: ```python python -m memory_profiler memory_test.py ``` 输出结果: ``` Filename: memory_test.py Line # Mem usage Increment Line Contents ================================================ 3 52.5 MiB 52.5 MiB @profile 4 def generate_list(): 5 81.9 MiB 29.4 MiB nums = [randint(0, 100) for _ in range(1000000)] 6 81.9 MiB 0.0 MiB return nums 12671490 ``` 输出结果中,`Line #`表示代码行号,`Mem usage`表示该行执行后的内存使用情况,`Increment`表示相对于上一行的内存增加量,`Line Contents`表示该行代码内容。我们可以看到,在`generate_list()`函数中,内存使用量从52.5 MiB增加到81.9 MiB,增加了29.4 MiB,随着程序的执行结束,内存使用量又降回到了52.5 MiB。 通过`memory_profiler`模块的输出结果,我们可以找出Python程序中的内存泄漏和不必要的内存占用,从而进行优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值