Почему python, похоже, выделяет больше памяти, чем sys.getsizeof учетных записей?

Пример:

import sys class Test(): def __init__(self): self.a = 'a' self.b = 'b' self.c = 'c' self.d = 'd' self.e = 'e' if __name__ == '__main__': test = [Test() for i in range(100000)] print(sys.getsizeof(test)) 

В диспетчере задач Windows: я получаю скачок ~ 20 МБ при создании списка из 100000 против 10.

Использование sys.getsizeoff (): для списка из 100000 я получаю 412 236 байт; для списка из 10 я получаю 100 байт.

Это кажется чрезвычайно непропорциональным. Почему это происходит?

Назначенная память не является диспропорциональной; вы создаете 100 000 объектов! Как вы можете видеть, они занимают примерно 34 мегабайта пространства:

 >>> sys.getsizeof(Test())+sys.getsizeof(Test().__dict__) 344 >>> (sys.getsizeof(Test())+sys.getsizeof(Test().__dict__)) * 1000000 / 10**6 34.4 #megabytes 

Вы можете получить небольшое улучшение с помощью __slots__ , но вам все равно потребуется около 20 МБ памяти для хранения этих 100 000 объектов.

 >>> sys.getsizeof(Test2())+sys.getsizeof(Test2().__slots__) 200 >>> sys.getsizeof(Test2())+sys.getsizeof(Test2().__slots__) * 1000000 / 10**6 20.0 #megabytes 

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

См. Ответ SO: Использование __slots__? http://docs.python.org/release/2.5.2/ref/slots.html

Использовать __slots__ :

 class Test2(): __slots__ = ['a','b','c','d','e'] def __init__(self): ... 

Каждый экземпляр ссылается на dict для его __dict__ который на __dict__ составляет 272 байта. Умножьте это на 100 000.