Подтвердить что ты не робот

Лучше ли хранить большое количество в списке?

Насколько эффективна память для хранения большого количества в списке? Почему происходит следующее?

>>> A = 100**100
>>> sys.getsizeof(A)
102
>>> B = [100**100]
>>> sys.getsizeof(B)
40

Почему размер A и B не равен?

>>> C = [1,100**100]
>>> sys.getsizeof(C)
44
>>> D = [1000**1000, 100**100]
>>> sys.getsizeof(D)
44

Почему размер C и D равен?

4b9b3361

Ответ 1

sys.getsizeof() возвращает неглубокий размер, то есть размер самого объекта списка, но не объектов, которые он содержит.

Из документации:

Учитывается только потребление памяти, непосредственно связанное с объектом, а не потребление памяти объектов, на которые он ссылается.

Если вы хотите вычислить глубину, возможно, стоит попробовать Pympler:

>>> from pympler.asizeof import asizeof
>>> A = 100**100
>>> asizeof(A)
120
>>> B = [100**100]
>>> asizeof(B)
200

Таким образом, на моем компьютере размещение длинной строки в списке добавляет 80 байтов служебных данных.

Ответ 2

Размер A и B не равен, потому что вы положили B в список. В этом случае A является длинным, а B - типом списка. C и D имеют одинаковый размер, поскольку их числовое содержимое имеет ту же ширину внутри контейнера списка.

Кроме того, sys.getsizeof() возвращает размер самого верхнего объекта, используя метод __sizeof__, а не размер элементов, на которые ссылается внутри этого объекта.

Ответ 3

из python wiki:

Из-за этого getsizeof() Возвращает размер объекта в байтах. Объектом может быть любой тип объекта. Все встроенные объекты вернут правильные результаты, но это не должно быть верно для сторонних расширений, поскольку это специфично для реализации.

Учитывается только потребление памяти, непосредственно связанное с объектом, а не потребление памяти объектами, на которые она ссылается.

и в этом случае B - это имя списка и фактически указатель на список! поэтому getsizeof() возвращает размер объекта списка, а не его содержимое!