Différence de vitesse SciPy cdist
Je suis curieux de savoir pourquoi les éléments suivants cdistdiffèrent tant dans le temps même s'ils produisent les mêmes résultats:
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.)
Le result_1est nettement plus rapide que result_2.
Réponses
L'implémentation C de la distance euclidienne, lignes source 50-66 , utilise la multiplication et un sqrt()appel tandis que la distance Minkowski, lignes source 381-391, est basée sur les appels beaucoup plus lents à la pow()fonction.
Pour référence, voir la discussion ici et ici comparant powà la multiplication et sqrt.
Ainsi, malgré l'apparence que la norme euclidienne appelle simplement la norme Minkowski, la ligne source 614 , appellecdist en fait directement l'implémentation C où le code est différent. La euclideanfonction python n'est pas appelée lors de l'exécution réelle.