What are the advantages of NumPy over regular Python lists?
В чем преимущества NumPy перед обычными списками Python?
В чем преимущества NumPy перед обычными списками Python?
У меня есть примерно 100 рядов финансовых рынков, и я собираюсь создать кубический массив размером 100x100x100 = 1 миллион ячеек. Я буду регрессировать (3 переменные) каждый x с каждым y и z, чтобы заполнить массив стандартными ошибками.
Я слышал, что для "больших матриц" я должен использовать NumPy в отличие от списков Python по соображениям производительности и масштабируемости. Дело в том, что я знаю списки Python, и они, кажется, работают для меня.
Каковы будут преимущества, если я перейду на NumPy?
Что, если бы у меня было 1000 рядов (то есть 1 миллиард ячеек с плавающей запятой в кубе)?
Переведено автоматически
Ответ 1
Массивы NumPy более компактны, чем списки Python - список списков, как вы описываете, на Python занял бы не менее 20 МБ или около того, в то время как трехмерный массив NumPy с плавающими значениями одинарной точности в ячейках поместился бы в 4 МБ. Доступ к элементам чтения и записи также ускоряется с NumPy.
Возможно, вас не так уж сильно волнует количество всего в миллион ячеек, но вы определенно заботились бы о миллиарде ячеек - ни один из подходов не вписался бы в 32-разрядную архитектуру, но с 64-разрядными сборками NumPy обойдется 4 ГБ или около того, одному Python потребуется по крайней мере около 12 ГБ (множество указателей, размер которых удваивается) - гораздо более дорогостоящее оборудование!
Разница в основном связана с "косвенностью" - список Python представляет собой массив указателей на объекты Python, не менее 4 байт на указатель плюс 16 байт даже для самого маленького объекта Python (4 для указателя типа, 4 для количества ссылок, 4 для значения - и распределители памяти округляют до 16). Массив NumPy - это массив однородных значений : числа одинарной точности занимают по 4 байта каждое, числа двойной точности - 8 байт. Менее гибкие, но вы существенно платите за гибкость стандартных списков Python!
Ответ 2
NumPy не просто эффективнее, но и удобнее. Вы получаете множество векторных и матричных операций бесплатно, которые иногда позволяют избежать ненужной работы. И они также эффективно реализованы.
Например, вы могли бы прочитать свой куб непосредственно из файла в массив:
x = numpy.fromfile(file=open("data"), dtype=float).reshape((100, 100, 100))
Удалите все четноиндексированные фрагменты в третьем измерении:
x[:, :, ::2]
Кроме того, многие полезные библиотеки работают с массивами NumPy. Например, библиотеки статистического анализа и визуализации.
Даже если у вас нет проблем с производительностью, изучение NumPy стоит затраченных усилий.
Ответ 3
Алекс упомянул эффективность использования памяти, а Роберто - удобство, и оба они хороши. В качестве еще нескольких идей я упомяну скорость и функциональность.
Функциональность: Вы получаете многое встроенное в NumPy, БПФ, свертки, быстрый поиск, базовую статистику, линейную алгебру, гистограммы и т.д. И действительно, кто может жить без БПФ?
Скорость: Вот тест на выполнение суммирования по списку и массиву NumPy, показывающий, что сумма в массиве NumPy в 10 раз быстрее (в этом тесте - пробег может отличаться).
Какие преимущества предлагают массивы NumPy перед (вложенными) списками Python?
Списки Python являются эффективными контейнерами общего назначения. Они поддерживают (довольно) эффективную вставку, удаление, добавление и конкатенацию, а понимание списков Python упрощает их создание и манипулирование. Однако у них есть определенные ограничения: они не поддерживают “векторизованные” операции, такие как поэлементное сложение и умножение, а тот факт, что они могут содержать объекты разных типов, означает, что Python должен хранить информацию о типе для каждого элемента и должен выполнять код диспетчеризации типов при работе с каждым элементом. Это также означает, что очень небольшое количество операций со списками может быть выполнено эффективными циклами C – каждая итерация потребует проверки типов и другой бухгалтерии Python API.