Да, это законно. Я запускаю 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
, который все равно будет работать
Это может быть более сложно, чем это смотрит в зависимости от того, как Вы хотите считать вещи. Например, если у Вас есть список ints, Вы хотите размер списка, содержащего эти ссылки к ints? (т.е. перечислите только, не, что содержится в нем), или сделайте Вы хотите включать фактические данные, указал, в этом случае необходимо иметь дело с дублирующимися ссылками, и как предотвратить двойной подсчет, когда два объекта содержат ссылки на тот же объект.
можно хотеть смотреть на одного из профилировщиков памяти Python, такой как pysizer, чтобы видеть, удовлетворяют ли они потребности.
Во-первых: ответ.
import sys
try: print sys.getsizeof(object)
except AttributeError:
print "sys.getsizeof exists in Python ≥2.6"
Обсуждение:
В Python, Вы никогда не можете получать доступ к "прямым" адресам памяти. Да ведь тогда, Вы нуждались бы или хотели бы знать, сколько такие адреса заняты данным объектом?? Это - вопрос, это является совершенно несоответствующим на том уровне абстракции. При рисовании дома Вы не спрашиваете, какие частоты света поглощены или отражены каждым из составляющих атомов в краске, Вы просто спрашиваете, что окрашивает, это - детали физических характеристик, которые создают тот цвет, не относятся к делу. Точно так же число байтов памяти, которую занимает данный объект Python, не относится к делу.
Так, почему Вы пытаетесь использовать Python для записи кода C?:)
Просто используйте функция, определяемая 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
, можно использовать этот обширный модуль вместо этого. Никогда не использовал его все же.
Можно использовать 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")
Используйте 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
можно также найти эту функцию в острота панель инструментов, вместе со многими другими полезными остротами:
Для массивов 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