Разница Python между списком и массивом [duplicate]

Устройте свой макет таким образом, чтобы существовало div, и единственное задание этого div должно диктовать и быть размером, которым вы хотите, чтобы быть холстом.

var canvas = document.createElement('canvas');
canvas.width = div.clientWidth;
canvas.height = div.clientHeight;

Затем добавьте холст в div.

289
задан Corey Goldberg 13 July 2015 в 14:56
поделиться

9 ответов

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

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

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

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

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

341
ответ дан Dan Lenski 15 August 2018 в 21:14
поделиться
  • 1
    Имеет ли numpy.ndarray тот же объем памяти, что и array.array? – Gordon Bean 28 October 2014 в 23:49
  • 2
    @Gordon, он должен быть очень похож в случае большого смежного массива: они оба потребуют байты sizeof(element) × (количество элементов), а также небольшой фиксированный заголовок для накладных расходов. Тем не менее, ndarray имеет некоторые дополнительные возможности для работы с несмежными и разреженными массивами, и я думаю, что некоторые подключаемые стратегии для распределения памяти для больших массивов ... некоторые из этих расширенных функций сделают ее пользовательской меньше памятью, тогда как другие повысят производительность, используя память more . – Dan Lenski 29 October 2014 в 05:57
  • 3
    @NithishInpursuitOfhappiness, список Python не является связанным списком. Он представлен внутренне как массив и имеет те же характеристики временной сложности, что и ArrayList Java. Таким образом, получение и установка i-го элемента списка Python занимает постоянное время . Добавление элемента в список Python приводит к амортизированному постоянному времени , потому что размер массива удваивается, когда в нем заканчивается пробел. Вставка элемента в или удаление из середины списка Python занимает время O (n) , потому что элементы должны быть сдвинуты. Для справки см.: wiki.python.org/moin/TimeComplexity – geofflee 5 November 2017 в 02:17
  • 4
    @DanLenski Спасибо, я знаю bytearray, возможно, стоит уточнить формулировку в вашем ответе – Chris_Rands 5 June 2018 в 08:06
  • 5
    Хорошая точка, @Chris_Rands. Обновлено. – Dan Lenski 5 June 2018 в 13:03

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

5
ответ дан Alex Coventry 15 August 2018 в 21:14
поделиться

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

12
ответ дан Ben Hoffstein 15 August 2018 в 21:14
поделиться

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

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

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

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

40
ответ дан dennisschagt 15 August 2018 в 21:14
поделиться
  • 1
    +1 для конкретного примера и упоминания о скорости. Главный ответ заставил меня задаться вопросом: «Есть ли компромисс во времени?» и «Существует ли какое-либо использование для этого, что не является очень эзотерическим случаем с низкой памятью» & quot; – leewz 5 February 2014 в 22:48

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

55
ответ дан Etaoin 15 August 2018 в 21:14
поделиться
  • 1
    Быть быстрее. – Mikael Jansson 6 October 2008 в 21:29
  • 2
    Возможно, никогда не использовал его, хотя было бы интересно запустить несколько тестов. – André 6 October 2008 в 21:43
  • 3
    На самом деле, я сделал быстрый тест - я приурочил суммирование списка с записями 100M и того же теста с соответствующим массивом, и список был фактически примерно на 10% быстрее. – Moe 6 October 2008 в 21:45
  • 4
    Списки выполняются быстрее, поскольку операции с массивом "raw" данные должны непрерывно создавать и уничтожать объекты python при чтении или записи в массив. – tzot 6 October 2008 в 22:37
  • 5
    @Moe, как я указал в своем ответе выше, встроенный в array Python не предназначен для выполнения математики . Если вы попробуете NumPy ndarray для суммирования массива из 10 ^ 8 чисел, он полностью ударит list. @tzot имеет правильное представление о том, почему встроенный array медленный для математики. – Dan Lenski 28 August 2014 в 07:46

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

7
ответ дан giltay 15 August 2018 в 21:14
поделиться

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

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

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

5
ответ дан Hortitude 15 August 2018 в 21:14
поделиться
  • 1
    Встроенные массивы python не эффективны по производительности, а только по памяти. – tzot 6 October 2008 в 22:40
  • 2
    Существуют экземпляры ARE, где массивы более эффективны с точки зрения обработки. См. Мое сообщение ниже: stackoverflow.com/questions/176011/… – Jason Baker 7 October 2008 в 15:03

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

профи каждого из них:

list

  • flexible
  • может быть гетерогенным

array (ex: numpy array)

  • массив однородных значений
  • однородный
  • компактный (по размеру)
  • эффективный (функциональность и скорость)
  • удобный
9
ответ дан KouchakYazdi 15 August 2018 в 21:14
поделиться

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

0
ответ дан vivek 15 August 2018 в 21:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: