Размер объектов в памяти во время сеанса IPython (с Гуппи?)

Я вспоминаю, что читал, что трудно точно определить точное использование памяти объектами в Python. Тем не менее, этот поток с 2009 года, и с тех пор я читал о различных профилировщиков памяти в Python (см. Примеры в этой теме). Кроме того, IPython значительно вырос в последние месяцы (версия 1.0 была выпущена несколько дней назад)

IPython уже имеет магию под названием whos, который печатает имена переменных, их типы и некоторые основные данные / информация.

Аналогичным образом, есть ли способ получить размер в памяти каждого из объектов, возвращаемых who? Какие-нибудь утилиты для этого уже есть в IPython?

Используя гуппи

Guppy (предлагается в этой теме) имеет команду, которая позволяет получить совокупное использование памяти для каждого типа объекта, но, к сожалению:

  1. Он не показывает использование памяти на объект
  2. Он печатает размеры в байтах (не в удобочитаемом формате)

Для второго может быть возможно применить bytes2human из этого ответа, но мне нужно было бы сначала собрать вывод h.heap() в формате, который я могу разобрать.

Но для первого (самого важного), есть ли способ заставить 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 ответ

Почему бы не использовать что-то вроде:

h.heap().byid

Но это покажет вам только непосредственные размеры (то есть не общий размер списка, включая другие списки, на которые он может ссылаться).

Если у вас есть конкретный объект, размер которого вы хотите получить, вы можете использовать:

h.iso(object).domisize

Найти приблизительный объем памяти, который освободился бы, если бы он был удален.

Другие вопросы по тегам