Каковы преимущества NumPy перед обычными списками Python?
У меня около 100 серий финансовых рынков, и я собираюсь создать массив кубов размером 100x100x100 = 1 миллион ячеек. Я буду регрессировать (с 3 переменными) каждый x с каждым y и z, чтобы заполнить массив стандартными ошибками.
Я слышал, что для «больших матриц» я должен использовать NumPy, а не списки Python, из соображений производительности и масштабируемости. Дело в том, что я знаю списки Python, и они, кажется, работают для меня.
Каковы будут преимущества, если я перейду на NumPy?
Что если бы у меня было 1000 рядов (то есть 1 миллиард клеток с плавающей запятой в кубе)?
getsizeof
не надежен. В документации четко указано, что: учитывается только потребление памяти, непосредственно относящееся к объекту, а не потребление памяти объектами, к которым он относится. Это означает, что если у вас есть вложенные списки Python, размер элементов не учитывается.getsizeof
в списке указывается только объем ОЗУ, который использует сам объект списка, и объем ОЗУ, используемый указателями в массиве данных, но не говорит, сколько ОЗУ используют объекты, на которые ссылаются эти указатели.float
s (4 байта) будет преобразован в нечто ближе к 32 ГБlist
s и Pythonfloat
(которые на самом деле являются Cdouble
s), а не 12 ГБ; каждыйfloat
на 64-битном Python занимает ~ 24 байта (при условии отсутствия потерь в выравнивании в распределителе), плюс еще 8 байтов вlist
для хранения ссылки (и это игнорирует перераспределение и заголовки объектов для самихlist
s, что может добавить еще один ГБ в зависимости от точно, сколько перераспределения происходит).NumPy не просто более эффективен; это также более удобно. Вы получаете множество векторных и матричных операций бесплатно, что иногда позволяет избежать ненужной работы. И они также эффективно реализованы.
Например, вы можете прочитать свой куб прямо из файла в массив:
Сумма по второму измерению:
Найдите, какие ячейки выше порога:
Удалите каждый четный фрагмент по третьему измерению:
Кроме того, многие полезные библиотеки работают с массивами NumPy. Например, статистический анализ и визуализация библиотек.
Даже если у вас нет проблем с производительностью, изучение NumPy стоит усилий.
источник
Алекс упомянул эффективность памяти, а Роберто упомянул удобство, и это хорошие моменты. Для еще нескольких идей я упомяну скорость и функциональность .
Функциональность: вы получаете много встроенного с NumPy, FFT, сверточными данными, быстрым поиском, базовой статистикой, линейной алгеброй, гистограммами и т. Д. И действительно, кто может жить без FFT?
Скорость: вот тест для суммирования по списку и массиву NumPy, показывающий, что сумма в массиве NumPy в 10 раз быстрее (в этом тесте пробег может варьироваться).
который в моих системах (пока я выполняю резервное копирование) дает:
источник
Вот хороший ответ из FAQ на сайте scipy.org :
Какие преимущества предлагают массивы NumPy перед (вложенными) списками Python?
источник
Все они выдвинули на первый план почти все основные различия между массивом numpy и списком Python, я просто опишу их здесь:
При создании Numpy массивы имеют фиксированный размер, в отличие от списков Python (которые могут динамически расти). Изменение размера ndarray создаст новый массив и удалит оригинал.
Все элементы в массиве Numpy должны быть одного типа данных (мы также можем иметь гетерогенный тип, но это не позволит вам выполнять математические операции) и, следовательно, иметь одинаковый размер в памяти
Numpy массивы облегчают продвижение математических и других типов операций на большом количестве данных. Как правило, такие операции выполняются более эффективно и с меньшим количеством кода, чем это возможно при использовании последовательностей питонов
источник