В Python словари, созданные для экземпляров класса, являются крошечными по сравнению со словарями, содержащими те же атрибуты этого класса:
import sys
class Foo(object):
def __init__(self, a, b):
self.a = a
self.b = b
f = Foo(20, 30)
При использовании Python 3.5.2 следующие вызовы getsizeof
производят:
>>> sys.getsizeof(vars(f)) # vars gets obj.__dict__
96
>>> sys.getsizeof(dict(vars(f))
288
288 - 96 = 192
сохранены байты!
Используя Python 2.7.12, хотя, с другой стороны, одни и те же вызовы возвращаются:
>>> sys.getsizeof(vars(f))
280
>>> sys.getsizeof(dict(vars(f)))
280
0
сохранены байты.
В обоих случаях словари, очевидно, имеют точно такое же содержимое:
>>> vars(f) == dict(vars(f))
True
так что это не фактор. Кроме того, это также относится только к Python 3.
Итак, что здесь происходит? Почему размер __dict__
экземпляра настолько мал в Python 3?