SciPy cdist Speed ​​Difference

Sep 24 2020

Estou curioso para cdistsaber por que os itens a seguir diferem tanto no tempo, embora produzam os mesmos resultados:

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

O result_1é significativamente mais rápido do que result_2.

Respostas

2 Alex Sep 24 2020 at 18:49

A implementação C da distância euclidiana, linhas de origem 50-66 , usa multiplicação e uma sqrt()chamada, enquanto a distância de Minkowski, linhas de origem 381-391 é baseada nas chamadas muito mais lentas para a pow()função.

Para referência, veja a discussão aqui e aqui comparando powa multiplicação e sqrt.

Portanto, apesar da aparência de que a norma euclidiana apenas chama a norma de Minkowski, a linha de origem 614 , cdistna verdade chama diretamente para a implementação C onde o código é diferente. A euclideanfunção python não é chamada na execução real.