2016-12-07 2 views
2

питон версия: Python 3.6.0b3 (по умолчанию, 16 ноября 2016, 16:55:09)почему sys.getsizeof возвращает тот же результат для очень больших списков

У меня есть следующий вывод:

>>> sys.getsizeof([0 for x in range(10**7)]) 
81528056 
>>> sys.getsizeof([0 for x in range(10**8)]) 
859724472 
>>> sys.getsizeof([0 for x in range(10**8+100500)]) 
859724472 
>>> sys.getsizeof([0 for x in range(10**9)]) 
8058558880 

Length of lists: 
>>> len([0 for x in range(10**8)]) 
100000000 
>>> len([0 for x in range(10**8+100500)]) 
100100500 
>>> 

Почему у меня такой же getsizeof выхода для списков, которые являются Len: 10**8 и 10**8+100500?

ответ

3

При увеличении на list is resized длины его на a bit more than 1/8 of the requested length. 100500 намного меньше 1/8 из 10 ** 8, что означает, что список, вероятно, не должен изменяться по сравнению с предыдущим размером, чтобы соответствовать новым записям.

+0

Но почему это изменение размера? Каждая строка создает новый список – Arseniy

+0

Поскольку понимание списка вытягивает записи из объекта «range» по одному за раз, что приводит к детерминированному поведению. –

+0

Я попытался запустить эти 2 команды в отдельных терминалах, результат был таким же. – Arseniy

0

sys.getsizeof показывает размер в байтах. Ваши списки с [0 для x в диапазоне (10 ** 8 ...)]) могут отображаться вместе с 859724472 байтами.

Смежные вопросы