Метод python sys.getsizeof возвращает разные размеры однотипных списков - PullRequest
0 голосов
/ 08 октября 2018

Я делаю два списка в IDLE Python 3.7, там есть имена a и b , они будут различаться с точки зрения инициализации, но содержимое одинаково (как мне кажется,, но, возможно, я ошибаюсь)


>>>a = [1,2,3,4]
>>>a
[1, 2, 3, 4]
>>>b = list(map(lambda x:x,a))
>>>b
[1, 2, 3, 4]

однако, когда я хочу узнать их размер с помощью метода sys.getsizeof sys.getsizeof (a) возвращает 96, тогда как sys.getsizeof (b) возвращает 120


, поэтому кто-нибудь может мне помочь понять, почему это происходит?PS: я просто пробовал карту функцию

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Python знает, насколько длинным будет список a, поэтому он делает его именно таким длинным.

Python точно не знает, насколько длинным будет список b, потому что map() ленив,поэтому список должен увеличиваться по мере добавления к нему элементов.Распределение памяти занимает довольно много времени, поэтому, когда ему требуется больше места, Python добавляет места для большего количества элементов, чем вы добавляете, чтобы избежать необходимости выделять память каждый раз.Это означает, что в динамически генерируемых списках часто есть пустые слоты.

Если эти 24 байта памяти действительно важны для вас, вы можете просто дать Python команду сделать копию b, нарезав: b[:],Так как Python знает, как долго b, копия будет иметь именно такое количество слотов и занимать наименьшее количество памяти.

Как отмечает nosklo, это поведение - деталь реализации.

0 голосов
/ 08 октября 2018

Так как ваш первый список a определен из литерала, он создается с размером «соответствовать», в то время как второй b динамически увеличивается во время выполнения, расширяется в реальном времени, чтобы соответствовать большему количеству элементов, прежде чем Python узнаетбудут элементы или нет.

Вот почему вы получаете разные размеры.

Списки растут и сужаются внутри в зависимости от ряда факторов.Это деталь реализации.Как пример, в моей реализации CPyhton 3:

import sys

l = []
for x in range(10):
    print(x, sys.getsizeof(l))
    l.append(x)

Результаты:

0 64
1 96
2 96
3 96
4 96
5 128
6 128
7 128
8 128
9 192

Как видите, список увеличивается в размерах, но иногда я получаю такой же размер вбайт, пока не «растет» только в определенных точках.Это сделано для того, чтобы экономить вычислительную мощность, увеличиваясь один раз, а не увеличиваться при каждом увеличении.

...