在IPython会话期间内存中对象的大小(使用Guppy?)

时间:2013-08-20 15:03:55

标签: python memory-management ipython heapy guppy

我记得reading很难确定Python中对象的确切内存使用情况。但是,该线程来自2009年,从那时起,我已经阅读了Python中的各种内存分析器(参见this thread中的示例)。此外,IPython近几个月已经成熟(几天前发布了1.0版)

IPython已经有一个名为whos的魔法,可以打印变量名称,类型和一些基本的数据/信息。

以类似的方式,有没有办法获得who返回的每个对象的内存大小 ? IPython中已经有用于此目的的任何实用程序了吗?

使用Guppy

Guppy(在this thread中建议)有一个命令可以让每个对象类型的累计内存使用 ,但不幸的是:

  1. 它没有显示内存使用量每个对象
  2. 以字节打印大小(不是以人类可读的格式)
  3. 对于第二个,可以从this answer应用bytes2human,但我需要首先以我可以解析的格式收集h.heap()的输出。 / p>

    但对于第一个(最重要的一个),有没有办法让Guppy显示内存使用每个对象

    In [6]: import guppy
    
    In [7]: h = guppy.hpy()                                                                                                                                     
    
    In [8]: h.heap()
    Out[8]: 
    Partition of a set of 2871824 objects. Total size = 359064216 bytes.
     Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
         0 522453  18 151469304  42 151469304  42 dict (no owner)
         1 451503  16 36120240  10 187589544  52 numpy.ndarray
         2 425700  15 34056000   9 221645544  62 sklearn.grid_search._CVScoreTuple
         3 193439   7 26904688   7 248550232  69 unicode
         4 191061   7 22696072   6 271246304  76 str
         5 751128  26 18027072   5 289273376  81 numpy.float64
         6  31160   1 12235584   3 301508960  84 list
         7 106035   4  9441640   3 310950600  87 tuple
         8   3300   0  7260000   2 318210600  89 dict of 0xb8670d0
         9   1255   0  3788968   1 321999568  90 dict of module
    <1716 more rows. Type e.g. '_.more' to view.>
    

1 个答案:

答案 0 :(得分:2)

为什么不使用类似的东西:

h.heap().byid

但这只会显示即时大小(即不是列表的总大小,包括它可能引用的其他列表)。

如果你有一个特定的物体,你希望得到你可以使用的尺寸:

h.iso(object).domisize

查找删除后将释放的大致内存量。