Почему использование памяти списком Python меньше ожидаемого? - PullRequest
0 голосов
/ 17 января 2019

enter image description here

Как видно на картинке. 50 000 000 записей занимают только 404M памяти, почему? Поскольку одна запись занимает 83 байта, 50 000 000 записей должны занимать 3967 МБ памяти.

>>> import sys
>>> a=[]
>>> for it in range(5*10**7):a.append("miJ8ZNFG9iFqiQQohvyTWwqsij2rJCiZ7v"+str(it))
... 
>>> print(sys.getsizeof(a)/1024**2)
404.4306411743164
>>> print(sys.getsizeof("miJ8ZNFG9iFqiQQohvyTWwqsij2rJCiZ7v"))
83
>>> print(83*5*10**7/1024**2)
3957.7484130859375
>>> 

1 Ответ

0 голосов
/ 17 января 2019

sys.getsizeof сообщает только стоимость самого list, а не его содержимое.Итак, вы видите стоимость хранения заголовка объекта list, плюс (чуть более) 50M указателей;Вы, вероятно, используете 64-битную (восьмибайтовую) систему указателей, поэтому хранилище для 50M-указателей составляет ~ 400 МБ.Чтобы получить истинный размер, потребуется sys.getsizeof для каждого объекта, рекурсивного __dict__ (если применимо) и т. Д. Каждого объекта, и он не будет на 100% точным, поскольку некоторые объекты (например, маленькие * 1006)* s), вероятно, являются общими; это не кроличья нора, которую вы хотите пробить .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...