Очень часто перед исследователем стоит задача накопления данных в массив, матрицу, трехмерный массив и т. д. Существует несколько способов сделать это. Наиболее эффективный - сначала выделить хранилище для размещения всех складируемых данных и затем записывать из в него по мере готовности. Существенное ограничение этого метода возникает при отсутствии информации о количестве данных. Знакомые с Матлабом могут провернуть такой трюк: использовать функции конкатенации данных совместно с массивами numpy. Однако, насколько эффективен этот способ?

Массивы дают наиболее быстрый способ доступа к данным. Это знает каждый, кто знаком с программированием. Массивы располагаются в непрерывной области памяти - это тоже известно всем. При изменении размера массива средствами NumPy происходит следующее - ищется новый блок памяти подходящего размера и туда копируется существующий контент. Так как это все делается с помощью библиотеки numpy все должно быть быстро, не правда ли?

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

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

import numpy as np

# добавление элементов в матрицу
buf = np.zeros(100)
arr = np.arange(100)
buf = np.row_stack((buf,arr))


#добавление массива в список
L= []
L.append(arr)

Что примечательно, для случая со списком наблюдается прирост производительности в 71 раз по сравнению с массивом. Тест был проведен для размера массива 100 элементов типа double.