2款Python記憶體偵查工具介紹和使用方法

來源:互聯網
上載者:User
去年自己寫過一個程式時,不太確定自己的記憶體使用量量,就想找寫工具來列印程式或函數的記憶體使用量量。
這裡將上次找到的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的,不過沒怎麼維護了。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.