Занимает ли объект списка как значение аргумента объекта массива память в Python? - PullRequest
2 голосов
/ 17 июня 2019

Объект array.array имеет меньший объем памяти, чем объект list в Python.По-прежнему ли эффективно использование памяти при создании array.array, как показано ниже?

from array import array
array('l', [1, 2, 3, 4, 5])

Мы все еще создаем объект списка (в качестве значения аргумента) для создания этого массива.Разве это не делает массив бесполезным?

Обновление : похоже, мне следует пересмотреть утверждение о том, что массивы занимают меньше места, чем списки.Кажется, что их поведение отличается в разных версиях Python:

Python 3.5.2 
>>> import array, sys
>>> mylist = [1, 2, 3]
>>> myarray = array.array('i', [1, 2, 3])
>>> sys.getsizeof(mylist)
44
>>> sys.getsizeof(myarray)
44

Python 3.6.3 
>>> import array, sys
>>> mylist = [1, 2, 3]
>>> myarray = array.array('i', [1, 2, 3])
>>> sys.getsizeof(mylist)
88
>>> sys.getsizeof(myarray)
76

Тем не менее, мой оригинальный вопрос все еще остается (для Python 3.6).myarray использовал список для построения.Как использование массива более эффективно для памяти?

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

sys.getsizeof не является рекурсивным.Итак, он показывает вам, сколько занимает список в памяти.Но не содержимое списка.Попробуйте это:

mylist = [ 5000, 5001, 5002 ]
sys.getsizeof(mylist) + sum(sys.getsizeof(q) for q in mylist)

вывод 172.

array.array, конечно, использует меньше памяти, он также упаковывает плотнее, поэтому он более дружественен к кешу.

ВВаш пример также список используется для создания array.array, а затем сразу же уничтожается.Так что здесь нет большой проблемы.

0 голосов
/ 17 июня 2019

Используя array.array, вы сохраняете смежные примитивы типа C вместо объектов.Если массивы настолько велики, что размер списка инициализаторов беспокоит вас, используйте итератор для инициализатора.Это должно уменьшить использование памяти до одного элемента во время инициализации массива.

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