it-roy-ru.com

Python List vs. Array - когда использовать?

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

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

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

315
Corey Goldberg

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

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

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

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

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

375
Dan Lenski

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

59
André

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

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

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

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

46
Jason Baker

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

плюсы каждого:

список

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

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

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

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

12
Ben Hoffstein

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

7
giltay

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

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

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

5
Hortitude

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

5
Alex Coventry

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

0
vivek