Память массивов numpy хорошо описана в его документах и много обсуждалась здесь. Раскладка памяти списка также обсуждалась, хотя обычно просто отличается от numpy.
Массив numpy имеет буфер данных фиксированного размера. «рост» требует создания нового массива и копирования в него данных. np.concatenate
делает это в скомпилированном коде. np.append
, а также все функции stack
используют concatenate
.
Насколько я понимаю, список имеет непрерывный буфер данных, который содержит указатели на объекты в других местах памяти. Python поддерживает некоторое свободное пространство в этом буфере, поэтому добавления с помощью list.append
выполняются относительно быстро и легко. Но когда свободное пространство заполняется, ему приходится создавать новый буфер и копировать указатели. Я вижу, где это может дорого стоить с большими списками.
Таким образом, список будет хранить указатель для каждого элемента, а также сам элемент (например, число с плавающей запятой) где-то еще в памяти. Напротив, массив с плавающей запятой хранит сами числа с плавающей запятой как непрерывные байты в своем буфере. (массивы dtype объектов больше похожи на списки).
Рекомендуемый способ итеративного создания массива — построить список с помощью append
и один раз создать массив в конце. Повторные np.append
или np.concatenate
относительно дороги.
deque
было упомянуто. Я мало знаю о том, как он хранит свои данные. В документах говорится, что он может добавлять элементы в начале так же легко, как и в конце, но произвольный доступ медленнее, чем для списка. Это означает, что он хранит данные в каком-то связанном списке, поэтому для поиска элемента nth
требуется пройти по ссылкам n-1
перед ним. Таким образом, существует компромисс между простотой роста и скоростью доступа.
Добавление элементов в начало списка требует создания нового списка указателей с новыми указателями в начале. Таким образом, добавление и удаление элементов в начале обычного списка намного дороже, чем в конце.
Рекомендация программного обеспечения не входит в основную цель SO. Другие могут внести предложения, но не удивляйтесь, если это закроют.
Существуют форматы файлов, такие как HDF5
, предназначенные для больших наборов данных. Они обеспечивают рост с помощью таких функций, как «дробление». И есть все виды пакетов баз данных.
person
hpaulj
schedule
09.12.2016
list
непрерывен; это не связанный список. Это как C++std::vector
указателей. - person user2357112 supports Monica   schedule 09.12.2016