Почему производительность одного и того же алгоритма цикла отличается

Прямо сейчас я делаю назначения из cs 231 n, и я хотел вычислить евклидово расстояние между точками:

dists[i, j]=0
for k in range(3072):
    dists[i, j]+=math.pow((X[i,k] - self.X_train[j,k]),2)
dists[i, j] = math.sqrt(dists[i,j])

однако этот код очень медленный. Потом я попробовал

 dists[i,j] = dist = np.linalg.norm(X[i,:] - self.X_train[j,:])

что намного быстрее. Вопрос почему? не np.linalg.norm также перебрать все координаты всех точек, вычитать, вводить в степень, суммировать и возводить их в квадрат? Может ли кто-нибудь дать мне подробный ответ: это из-за того, как np.linalg.norm элементы доступа или есть другая причина?

1 ответ

Решение

NumPy может выполнить весь расчет одним махом в оптимизированном, ускоренном (например, SSE, AVX, что у вас есть) C-коде.

Оригинальный код выполняет всю свою работу на Python (кроме math функции, которые реализованы в C, но также требуют много времени для обхода объектов Python), что, ну, в общем, медленнее.

Другие вопросы по тегам