SciPy cdist Speed ​​Difference

Sep 24 2020

Sono curioso di sapere perché i seguenti cdistdifferiscono così tanto nel tempo anche se producono gli stessi risultati:

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.)

Il result_1è significativamente più veloce result_2.

Risposte

2 Alex Sep 24 2020 at 18:49

L'implementazione C della distanza euclidea, linee sorgente 50-66 , utilizza la moltiplicazione e una sqrt()chiamata mentre la distanza Minkowski, linee sorgente 381-391 si basa sulle chiamate molto più lente alla pow()funzione.

Per riferimento, vedere la discussione qui e qui a confronto powcon la moltiplicazione e sqrt.

Quindi, nonostante l'apparenza che la norma euclidea chiami semplicemente la norma Minkowski, la riga sorgente 614 , in cdistrealtà chiama direttamente attraverso l'implementazione C dove il codice è diverso. La euclideanfunzione python non viene chiamata durante l'esecuzione effettiva.