Список Python против массива - когда использовать?

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

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

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

Ответ 1

По сути, списки 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 предлагает изменяемую строку байтов как bytearray.

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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

список

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

Этот ответ подытожит почти все вопросы о том, когда использовать List и Array:

  1. Основное различие между этими двумя типами данных заключается в операциях, которые вы можете выполнять над ними. Например, вы можете разделить массив на 3, и он разделит каждый элемент массива на 3. То же самое нельзя сделать со списком.

  2. Список является частью синтаксиса Python, поэтому его не нужно объявлять, тогда как вы должны объявить массив перед его использованием.

  3. Вы можете хранить значения разных типов данных в списке (разнородных), тогда как в массиве вы можете хранить значения только одного и того же типа данных (однородных).

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

  5. Массивы занимают меньше памяти по сравнению со списками.