Python List против Array - когда использовать? - PullRequest
329 голосов
/ 07 октября 2008

Если вы создаете одномерный массив, вы можете реализовать его в виде списка или использовать модуль «массив» в стандартной библиотеке. Я всегда использовал списки для 1d массивов.

По какой причине или обстоятельству я бы хотел использовать вместо этого модуль массива?

Это для оптимизации производительности и памяти, или я упускаю что-то очевидное?

Ответы [ 9 ]

387 голосов
/ 07 октября 2008

По сути, списки Python очень гибкие и могут содержать совершенно разнородные произвольные данные, и к ним можно очень эффективно добавлять в амортизированное постоянное время . Если вам нужно сокращать и расширять свой список эффективно и без лишних хлопот, они - путь. Но они используют намного больше места, чем массивы C .

Тип array.array, с другой стороны, является просто тонкой оболочкой для массивов C. Он может содержать только однородные данные одного типа, поэтому он использует только sizeof(one object) * length байтов памяти. В основном, вы должны использовать его, когда вам нужно предоставить массив C расширению или системному вызову (например, ioctl или fctnl).

array.array также является разумным способом представления изменяемой строки в Python 2.x (array('B', bytes)). Тем не менее, Python 2.6+ и 3.x предлагает изменяемую строку byte как bytearray.

Однако, если вы хотите выполнить math для однородного массива числовых данных, тогда вам гораздо лучше использовать NumPy, который может автоматически векторизовать операции над сложными многомерными массивами.

Короче говоря, : array.array полезно, когда вам нужен однородный массив данных C по причинам , отличным от математических .

60 голосов
/ 07 октября 2008

Почти во всех случаях нормальный список является правильным выбором. Модуль массивов больше похож на тонкую оболочку над массивами C, которая дает вам строго типизированные контейнеры (см. docs ) с доступом к более C-подобным типам, таким как sign / unsigned short или double, не являются частью встроенных типов. Я бы сказал, использовать модуль массивов, только если он вам действительно нужен, во всех других случаях придерживайтесь списков.

48 голосов
/ 07 октября 2008

Модуль массива является одной из тех вещей, в которых вы, вероятно, не нуждаетесь, если не знаете, зачем его использовать (и обратите внимание, что я не пытаюсь сказать это в снисходительной образом!). Большую часть времени модуль массива используется для взаимодействия с кодом Си. Чтобы дать вам более прямой ответ на ваш вопрос о производительности:

Массивы более эффективны, чем списки для некоторых целей. Если вам нужно выделить массив, который, как вы ЗНАЕТЕ, не изменится, тогда массивы могут быть быстрее и использовать меньше памяти. У GvR есть оптимизационный анекдот , в котором модуль массива оказывается победителем (долго читать, но оно того стоит).

С другой стороны, одна из причин, по которой списки занимают больше памяти, чем массивы, заключается в том, что python выделит несколько дополнительных элементов, когда все выделенные элементы будут использованы. Это означает, что добавление элементов в списки происходит быстрее. Так что, если вы планируете добавлять элементы, список - это путь.

TL; DR Я бы использовал массив только в том случае, если у вас была исключительная потребность в оптимизации или вам нужно взаимодействовать с кодом C (и вы не можете использовать pyrex ).

15 голосов
/ 30 января 2017

Это компромисс!

плюсы каждого из них:

список

  • гибкий
  • может быть гетерогенным

массив (например: массив numpy)

  • массив равномерных значений
  • однородны
  • компактный (по размеру)
  • эффективный (функциональность и скорость)
  • удобный
13 голосов
/ 07 октября 2008

Насколько я понимаю, массивы хранятся более эффективно (то есть как непрерывные блоки памяти по сравнению с указателями на объекты Python), но я не осознаю каких-либо преимуществ для производительности. Кроме того, с массивами вы должны хранить примитивы одного типа, тогда как списки могут хранить что угодно.

7 голосов
/ 07 октября 2008

Стандартные библиотечные массивы полезны для двоичного ввода-вывода, например, для преобразования списка целых чисел в строку для записи, скажем, в волновой файл. Тем не менее, как уже отмечали многие, если вы собираетесь делать какую-то реальную работу, то вам следует рассмотреть возможность использования NumPy.

5 голосов
/ 07 октября 2008

Если вы собираетесь использовать массивы, рассмотрите пакеты numpy или scipy, которые дают вам массивы с гораздо большей гибкостью.

5 голосов
/ 07 октября 2008

Массив можно использовать только для определенных типов, тогда как списки можно использовать для любого объекта.

Массивы также могут содержать данные только одного типа, тогда как список может содержать записи различных типов объектов.

Массивы также более эффективны для некоторых численных расчетов.

0 голосов
/ 17 июля 2018

Важное различие между массивом numpy и списком состоит в том, что срезы массива являются представлениями исходного массива. Это означает, что данные не копируются, и любые изменения в представлении будут отражены в исходном массиве.

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