2017-01-09 5 views
0

Ich muss den Kosinusabstand zwischen jeder zwei Zeilen einer Matrix berechnen. ich brauchte jedes Mal eine einzelne Zeile, so meine naive Implementierung war:Die Vorteile von scipy.spatial.distance.pdist verstehen

 for Id1 in range(m.shape[0]): 
     distance = [scipy.spatial.distance.cosine(m[Id1,],m[Id2,]) for Id2 in range(m.shape[0])] 

Es stellt sich heraus, die die naive Implementierung erfordert ca. 4 Sekunden für 407 * 53 Matrix.

Obwohl ich nicht die volle Matrix möchte ich versucht:

pairwiseDistance = scipy.spatial.distance.pdist(m,metric = 'cosine') 

Es erfordert nur 0,004 Sekunden

ich eine kleine lineare Verbesserung erwartet (ich brauche nur die Hälfte der Matrix (!) , der Prozess kann parallel usw. durchgeführt werden). Was ist der Grund, dass die Verbesserung so signifikant ist?

Antwort

0

Wenn Sie eine Zeichenfolge an pdist übergeben, um eine der vordefinierten Metriken zu verwenden, wird eine in C geschriebene Version verwendet, die viel schneller ist als die Python-Anweisung. Dies wird in the documentation erwähnt.

Selbst mit pdist mit einer Python-Funktion könnte etwas schneller sein als eine Liste Verständnis verwenden, da pdist noch das Looping tun können und den Ergebnis-Array in C

+0

-Code in C kann 1000 schneller als Code ausgeführt implementiert zuteilen geschrieben in Python? –

+0

@Guys: In einigen Fällen ja. – BrenBarn