Почему массивы NumPy такие быстрые? - PullRequest
51 голосов
/ 05 декабря 2011

Я только что изменил программу, которую я пишу, чтобы хранить мои данные в виде пустых массивов, поскольку у меня были проблемы с производительностью, и разница была невероятной. Первоначально для запуска потребовалось 30 минут, а теперь - 2,5 секунды!

Мне было интересно, как это происходит. Я предполагаю, что это потому, что это устраняет необходимость в for петлях, но за этим я в тупике.

Ответы [ 5 ]

79 голосов
/ 05 декабря 2011

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

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

15 голосов
/ 05 декабря 2011

numpy массивы являются специализированными структурами данных. Это означает, что вы получаете не только преимущества эффективного представления в памяти, но и эффективные специализированные реализации.

например. если вы суммируете два массива, то добавление будет выполняться с помощью специализированных векторных операций ЦП , вместо вызова реализации Python для добавления int в цикле.

1 голос
/ 05 декабря 2011

У вас все еще есть циклы, но они сделаны в c.Numpy основан на Atlas, которая является библиотекой для операций линейной алгебры.

http://math -atlas.sourceforge.net /

При работе с большими вычислениямипроведет тесты, используя несколько реализаций, чтобы выяснить, какая из них является самой быстрой на нашем компьютере в данный момент.При некоторых сложных сборках вычисления могут распараллеливаться на нескольких процессорах.Таким образом, у вас будет высоко оптимизированный c, работающий на непрерывных блоках памяти.

0 голосов
/ 02 мая 2019

Рассмотрим следующий код:

import numpy as np
import time

a = np.random.rand(1000000)
b = np.random.rand(1000000)

tic = time.time()
c = np.dot(a, b)
toc = time.time()

print("Vectorised version: " + str(1000*(toc-tic)) + "ms")

c = 0
tic = time.time()
for i in range(1000000):
    c += a[i] * b[i]
toc = time.time()

print("For loop: " + str(1000*(toc-tic)) + "ms")

Выход:

Vectorised version: 2.011537551879883ms
For loop: 539.8685932159424ms

Здесь Numpy намного быстрее, потому что использует преимущества параллелизма (который имеет место в случае нескольких данных с одной инструкцией (SIMD)), в то время как традиционный цикл for не может его использовать.

0 голосов
/ 05 декабря 2011

Массивы Numpy очень похожи на «нормальные» массивы, такие как в c. Обратите внимание, что каждый элемент должен быть одного типа. Ускорение велико, потому что вы можете воспользоваться преимуществами предварительной выборки и мгновенно получить доступ к любому элементу массива по его индексу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...