Каковы преимущества NumPy перед обычными списками Python? - PullRequest
424 голосов
/ 15 июня 2009

Каковы преимущества NumPy перед обычными списками Python?

У меня около 100 серий финансовых рынков, и я собираюсь создать массив кубов размером 100x100x100 = 1 миллион ячеек. Я буду регрессировать (с 3 переменными) каждый x с каждым y и z, чтобы заполнить массив стандартными ошибками.

Я слышал, что для "больших матриц" я должен использовать NumPy, а не списки Python, в целях производительности и масштабируемости Дело в том, что я знаю списки Python, и они, кажется, работают для меня.

Какими будут преимущества, если я перейду на NumPy?

Что если бы у меня было 1000 рядов (то есть 1 миллиард ячеек с плавающей запятой в кубе)?

Ответы [ 6 ]

672 голосов
/ 15 июня 2009

Массивы NumPy более компактны, чем списки Python - список списков, который вы описываете в Python, займет не менее 20 МБ или около того, в то время как 3D-массив NumPy с плавающей точкой одинарной точности в ячейках поместится в 4 MB. Доступ к чтению и письму также быстрее с NumPy.

Может быть, вас не волнует только миллион ячеек, но вы определенно хотели бы иметь миллиард ячеек - ни один из подходов не подошел бы для 32-битной архитектуры, но с 64-битными сборками NumPy обойдется без 4 ГБ или около того, одному только Python понадобится как минимум около 12 ГБ (много указателей, которые удваиваются в размере) - гораздо более дорогая часть оборудования!

Различие в основном связано с «косвенностью» - список Python представляет собой массив указателей на объекты Python, по крайней мере 4 байта на указатель плюс 16 байтов даже для самого маленького объекта Python (4 для указателя типа, 4 для ссылки количество, 4 для значения - и распределители памяти округляются до 16). Массив NumPy - это массив однородных значений - числа одинарной точности занимают 4 байта каждое, числа двойной точности - 8 байтов. Менее гибкий, но вы платите существенно за гибкость стандартных списков Python!

219 голосов
/ 15 июня 2009

NumPy не просто более эффективен; это также более удобно. Вы получаете множество векторных и матричных операций бесплатно, что иногда позволяет избежать ненужной работы. И они также эффективно реализованы.

Например, вы можете прочитать свой куб прямо из файла в массив:

x = numpy.fromfile(file=open("data"), dtype=float).reshape((100, 100, 100))

Сумма по второму измерению:

s = x.sum(axis=1)

Найдите ячейки выше порога:

(x > 0.5).nonzero()

Удалите каждый четный фрагмент по третьему измерению:

x[:, :, ::2]

Кроме того, многие полезные библиотеки работают с массивами NumPy. Например, библиотеки статистического анализа и визуализации.

Даже если у вас нет проблем с производительностью, изучение NumPy стоит усилий.

105 голосов
/ 15 июня 2009

Алекс упомянул эффективность памяти, а Роберто упомянул удобство, и это оба хорошие моменты. Для еще нескольких идей я упомяну скорость и функциональность .

Функциональность: вы получаете много встроенного с помощью NumPy, FFT, сверток, быстрого поиска, базовой статистики, линейной алгебры, гистограмм и т. Д. И действительно, кто может жить без FFT?

Скорость: вот тест для суммирования по списку и массиву NumPy, показывающий, что сумма в массиве NumPy в 10 раз быстрее (в этом тесте - пробег может варьироваться).

from numpy import arange
from timeit import Timer

Nelements = 10000
Ntimeits = 10000

x = arange(Nelements)
y = range(Nelements)

t_numpy = Timer("x.sum()", "from __main__ import x")
t_list = Timer("sum(y)", "from __main__ import y")
print("numpy: %.3e" % (t_numpy.timeit(Ntimeits)/Ntimeits,))
print("list:  %.3e" % (t_list.timeit(Ntimeits)/Ntimeits,))

, который в моих системах (пока я выполняю резервное копирование) дает:

numpy: 3.004e-05
list:  5.363e-04
39 голосов
/ 11 сентября 2014

Вот хороший ответ из FAQ на сайте scipy.org :

Какие преимущества имеют массивы NumPy перед (вложенными) списками Python?

Списки Python являются эффективными контейнерами общего назначения. Они поддерживают (достаточно) эффективная вставка, удаление, добавление и объединение, и понимание списков Python позволяет легко создавать и манипулировать. Однако у них есть определенные ограничения: они не поддерживают «Векторизованные» операции, такие как поэлементное сложение и умножение, и тот факт, что они могут содержать объекты разных типов, означает что Python должен хранить информацию о типе для каждого элемента, и должен выполнить тип диспетчерского кода при работе с каждым элементом. это также означает, что очень немногие операции со списком могут быть выполнены эффективные циклы C - каждая итерация потребует проверки типа и других Бухгалтерия API Python.

3 голосов
/ 05 февраля 2019

Все они выделили почти все основные различия между массивом numpy и списком python, я просто кратко расскажу о них здесь:

  1. Массивы Numpy имеют фиксированный размер при создании, в отличие от списков Python (которые могут динамически расти). Изменение размера ndarray создаст новый массив и удалит оригинал.

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

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

0 голосов
/ 08 июня 2019

Numpy предоставляет ряд очень мощных математических инструментов для работы с массивами или матрицами numpy, если хотите. Поскольку numpy очень хорошо оптимизирован и написан на C, он работает намного быстрее, чем если бы вы написали свой код на python. Не говоря уже о том, что было бы больно в задницу самому кодировать все функции.

...