Почему 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 байт.
Это кажется чрезвычайно непропорциональным. Почему это происходит?
- Python: количество элементов в списке для условия if
- Использование python для чтения txt-файлов и ответов на вопросы
- python + Spreadsheet
- Эффективный способ хранения кортежей в хранилище данных
- регистрация в python
Назначенная память не является диспропорциональной; вы создаете 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.
- Обеспечение возврата всех просмотров Django 200?
- Путаница в отношении простого wsgi-сервера python (wsgiref.simple_server)
- Как сгладить список списков на один шаг
- синтаксический анализ json-форматированных запросов в appengine
- Python – программа не отображается, как предполагалось
- Как вы храните два разных входа из одной и той же переменной?
- Google App Engine: изменение 1000 объектов с помощью TaskQueue
- Python "SyntaxError: не-ASCII-символ '\ xe2' в файле"
- Почему мой формат python% s не занимает места?
- один файл py для конвертирования сначала в html
- Загрузка db.ListProperty () с загрузчиком AppEngine