По сути, списки 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 по причинам, отличным от математического .
sizeof(element)
× (количество элементов) байтов, плюс небольшой фиксированный заголовок для служебных данных. Тем не менее, ndarray имеет некоторые расширенные опции для работы с разрозненными и разреженными массивами, и я думаю, что некоторые подключаемые стратегии для выделения памяти для больших массивов ... некоторые из этих расширенных функций сделают его менее оперативным, в то время как другие улучшат производительность, используя больше Память.Почти во всех случаях нормальный список является правильным выбором. Модуль массивов больше похож на тонкую оболочку над массивами Си, которая дает вам строго типизированные контейнеры (см. Документы ), с доступом к более C-подобным типам, таким как подписанные / неподписанные короткие или двойные, которые не являются частью встроенного в типах. Я бы сказал, использовать модуль массива, только если он вам действительно нужен, во всех остальных случаях придерживайтесь списков.
источник
array
в не предназначен для выполнения математика . Если вы попытаетесь использовать NumPyndarray
для суммирования массива из 10 ^ 8 чисел, он будет полностьюlist
удален. У @tzot есть правильное представление о том, почему встроенная системаarray
работает медленно по математике.Модуль массива - это одна из тех вещей, в которых вы, вероятно, не нуждаетесь, если не знаете, зачем его использовать (и обратите внимание, что я не пытаюсь сказать это снисходительно!) , Большую часть времени модуль массива используется для взаимодействия с кодом Си. Чтобы дать вам более прямой ответ на ваш вопрос о производительности:
Массивы более эффективны, чем списки для некоторых целей. Если вам нужно выделить массив, который, как вы ЗНАЕТЕ, не изменится, тогда массивы могут быть быстрее и использовать меньше памяти. GvR имеет анекдот по оптимизации, в котором модуль массива оказывается победителем (долго читал, но оно того стоит).
С другой стороны, одна из причин, по которой списки занимают больше памяти, чем массивы, заключается в том, что python выделит несколько дополнительных элементов, когда все выделенные элементы будут использованы. Это означает, что добавление элементов в списки происходит быстрее. Так что, если вы планируете добавлять элементы, список - это путь.
TL; DR Я бы использовал массив, только если у вас была исключительная потребность в оптимизации или вам нужно взаимодействовать с кодом C (и вы не можете использовать pyrex ).
источник
плюсы каждого:
список
массив (напр .: массив numpy)
источник
Насколько я понимаю, массивы хранятся более эффективно (то есть как непрерывные блоки памяти по сравнению с указателями на объекты Python), но я не знаю о какой-либо выигрыш в производительности. Кроме того, с массивами вы должны хранить примитивы одного типа, тогда как списки могут хранить что угодно.
источник
Массивы стандартной библиотеки полезны для двоичного ввода-вывода, например, для преобразования списка целых чисел в строку для записи, скажем, в волновой файл. Тем не менее, как уже отмечали многие, если вы собираетесь делать какую-то реальную работу, то вам следует рассмотреть возможность использования NumPy.
источник
Если вы собираетесь использовать массивы, рассмотрите пакеты numpy или scipy, которые дают вам массивы с большей гибкостью.
источник
Массив может использоваться только для определенных типов, тогда как списки могут использоваться для любого объекта.
Массивы также могут содержать только данные одного типа, в то время как список может содержать записи различных типов объектов.
Массивы также более эффективны для некоторых численных расчетов.
источник
Важное различие между массивом numpy и списком состоит в том, что срезы массива являются представлениями исходного массива. Это означает, что данные не копируются, и любые изменения в представлении будут отражены в исходном массиве.
источник
Этот ответ подытожит почти все запросы о том, когда использовать List и Array:
Основное различие между этими двумя типами данных заключается в операциях, которые вы можете выполнять над ними. Например, вы можете разделить массив на 3, и он разделит каждый элемент массива на 3. То же самое нельзя сделать со списком.
Список является частью синтаксиса python, поэтому его не нужно объявлять, в то время как вы должны объявить массив перед его использованием.
Вы можете хранить значения разных типов данных в списке (разнородных), тогда как в массиве вы можете хранить значения только одного и того же типа данных (однородных).
Массивы, обладающие большими функциональными возможностями и быстрыми, широко используются для арифметических операций и для хранения большого объема данных - по сравнению со списком.
Массивы занимают меньше памяти по сравнению со списками.
источник
Что касается производительности, вот некоторые цифры, сравнивающие списки, массивы и пустые массивы Python (все с Python 3.7 на Macbook Pro 2017 года). Конечным результатом является то, что список python является самым быстрым для этих операций.
источник