SciPy cdist Różnica prędkości
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
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.