Как определить размер объекта в Python?

Да, это законно. Я запускаю Python 2.6

try:
    [] + 3
except Exception as x:
    print "woo hoo"

>>> 
woo hoo

Обновление: есть еще одна причина использовать синтаксис as. Использование , делает вещи намного более неоднозначными, как указывали другие; и вот что делает разницу. С Python 2.6 существует multicatch, который позволяет вам улавливать несколько исключений в одном блоке except . В такой ситуации более выразительно и pythonic сказать

except (exception1, exception2) as e

, а не говорить

except (exception1, exception2), e

, который все равно будет работать

548
задан Community 23 May 2017 в 12:34
поделиться

6 ответов

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

можно хотеть смотреть на одного из профилировщиков памяти Python, такой как pysizer, чтобы видеть, удовлетворяют ли они потребности.

12
ответ дан Brian 23 May 2017 в 12:34
поделиться
  • 1
    @hasen j: Я соглашаюсь, если Вы не знаете, что всегда необходимо выполнять итерации через целый массив каждый раз, когда, в этом случае сигнальная метка может разъяснить код немного. Проблема с сигнальной меткой - Вы, может закончиться с O (N) поведение, где O (1) сделали бы, и не всегда понимают его. – quark 20 October 2009 в 23:41

Во-первых: ответ.

import sys

try: print sys.getsizeof(object)
except AttributeError:
    print "sys.getsizeof exists in Python ≥2.6"

Обсуждение:
В Python, Вы никогда не можете получать доступ к "прямым" адресам памяти. Да ведь тогда, Вы нуждались бы или хотели бы знать, сколько такие адреса заняты данным объектом?? Это - вопрос, это является совершенно несоответствующим на том уровне абстракции. При рисовании дома Вы не спрашиваете, какие частоты света поглощены или отражены каждым из составляющих атомов в краске, Вы просто спрашиваете, что окрашивает, это - детали физических характеристик, которые создают тот цвет, не относятся к делу. Точно так же число байтов памяти, которую занимает данный объект Python, не относится к делу.

Так, почему Вы пытаетесь использовать Python для записи кода C?:)

-5
ответ дан tzot 23 May 2017 в 12:34
поделиться
  • 1
    То же верно о передаче его к функции. Все это зависит от того, как Вы передаете его. – AnT 20 October 2009 в 23:35

Просто используйте функция, определяемая sys.getsizeof в sys модуль.

sys.getsizeof(object[, default]):

Возврат размер объекта в байтах. Объект может быть любым типом объекта. Все встроенные объекты возвратят корректные результаты, но это не должно сохраняться для сторонних расширений, поскольку это - конкретная реализация.

default аргумент позволяет определять значение, которое будет возвращено, если тип объекта не обеспечит средства получить размер и вызовет TypeError.

getsizeof вызовы метод object’s __sizeof__ и добавляет дополнительный сборщик "мусора" наверху, если объектом управляет сборщик "мусора".

пример Использования, в python 3.0:

>>> import sys
>>> x = 2
>>> sys.getsizeof(x)
24
>>> sys.getsizeof(sys.getsizeof)
32
>>> sys.getsizeof('this')
38
>>> sys.getsizeof('this also')
48

, Если Вы находитесь в Python < 2.6 и не имеют sys.getsizeof, можно использовать этот обширный модуль вместо этого. Никогда не использовал его все же.

553
ответ дан Nabin 23 May 2017 в 12:34
поделиться

Можно использовать getSizeof (), как упомянуто ниже для определения размера объекта

import sys
str1 = "one"
int_element=5
print("Memory size of '"+str1+"' = "+str(sys.getsizeof(str1))+ " bytes")
print("Memory size of '"+ str(int_element)+"' = "+str(sys.getsizeof(int_element))+ " bytes")
0
ответ дан 22 November 2019 в 22:00
поделиться

Используйте sys.getsizeof () , если Вы не хотите включать размеры связанных (вложенных) объектов.

Однако, если Вы хотите считать подобъекты вложенными в списках, dicts, наборах, кортежах - и обычно ЭТО - то, что Вы ищете - используют рекурсивное глубокий sizeof () функция как показано ниже:

def sizeof(obj):
    size = sys.getsizeof(obj)
    if isinstance(obj, dict): return size + sum(map(sizeof, obj.keys())) + sum(map(sizeof, obj.values()))
    if isinstance(obj, (list, tuple, set, frozenset)): return size + sum(map(sizeof, obj))
    return size

можно также найти эту функцию в острота панель инструментов, вместе со многими другими полезными остротами:

https://github.com/mwojnars/nifty/blob/master/util.py

0
ответ дан 22 November 2019 в 22:00
поделиться

Для массивов numpy getsizeof не работает - для меня по какой-то причине он всегда возвращает 40:

from pylab import *
from sys import getsizeof
A = rand(10)
B = rand(10000)

Затем (в ipython):

In [64]: getsizeof(A)
Out[64]: 40

In [65]: getsizeof(B)
Out[65]: 40

К счастью, хотя:

In [66]: A.nbytes
Out[66]: 80

In [67]: B.nbytes
Out[67]: 80000
79
ответ дан 22 November 2019 в 22:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: