Размер объектов в памяти во время сеанса IPython (с Гуппи?)
Я вспоминаю, что читал, что трудно точно определить точное использование памяти объектами в Python. Тем не менее, этот поток с 2009 года, и с тех пор я читал о различных профилировщиков памяти в Python (см. Примеры в этой теме). Кроме того, IPython значительно вырос в последние месяцы (версия 1.0 была выпущена несколько дней назад)
IPython уже имеет магию под названием whos
, который печатает имена переменных, их типы и некоторые основные данные / информация.
Аналогичным образом, есть ли способ получить размер в памяти каждого из объектов, возвращаемых who
? Какие-нибудь утилиты для этого уже есть в IPython?
Используя гуппи
Guppy (предлагается в этой теме) имеет команду, которая позволяет получить совокупное использование памяти для каждого типа объекта, но, к сожалению:
- Он не показывает использование памяти на объект
- Он печатает размеры в байтах (не в удобочитаемом формате)
Для второго может быть возможно применить 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
Найти приблизительный объем памяти, который освободился бы, если бы он был удален.