SciPy cdist Różnica prędkości

Sep 24 2020

Jestem ciekawy, dlaczego poniższe cdistróżnią się tak bardzo w czasie, mimo że dają takie same wyniki:

import numpy as np
from scipy.spatial.distance import cdist

x = np.random.rand(10_000_000, 50)
y = np.random.rand(50)

result_1 = cdist(x, y[np.newaxis, :])

result_2 = cdist(x, y[np.newaxis, :], `minkowski`, p=2.)

result_1Jest znacznie szybsze niż result_2.

Odpowiedzi

2 Alex Sep 24 2020 at 18:49

Implementacja odległości euklidesowej w C, linie źródłowe 50-66 , wykorzystuje mnożenie i sqrt()wywołanie, podczas gdy odległość Minkowskiego, linie źródłowe 381-391 są oparte na znacznie wolniejszych wywołaniach pow()funkcji.

Dla odniesienia, zobacz dyskusję tutaj i tutaj w porównaniu powz mnożeniem i sqrt.

Tak więc pomimo pozoru, że norma euklidesowa po prostu wywołuje normę Minkowskiego, wiersz źródłowy 614 , w cdistrzeczywistości wywołuje bezpośrednio implementację C, w której kod jest inny. Funkcja Pythona euclideannie jest wywoływana podczas rzeczywistego wykonywania.