Différence de vitesse SciPy cdist

Sep 24 2020

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

2 Alex Sep 24 2020 at 18:49

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.