2015-05-27 18 views
5

Ich habe numpy mit OpenBlas kompiliert und ich frage mich, warum einsum ist viel langsamer als Punkt (ich verstehe in den 3 Indizes Fall, aber ich verstehe nicht, warum es auch in den zwei Indizes Fall weniger leistungsfähig ist)? Hier ein Beispiel:Warum ist numpy.dot viel schneller als numpy.einsum?

import numpy as np 
A = np.random.random([1000,1000]) 
B = np.random.random([1000,1000]) 

%timeit np.dot(A,B) 

Out: 10 loops, best of 3: 26.3 ms per loop 

%timeit np.einsum("ij,jk",A,B) 

Out: 5 loops, best of 3: 477 ms per loop 

Gibt es eine Möglichkeit einsum Verwendung OpenBlas und Parallelisierung wie numpy.dot zu lassen? Warum ruft np.einsum nicht nur np.dot auf, wenn es ein Punktprodukt bemerkt?

+0

In Verbindung stehende: http://stackoverflow.com/questions/20149201/why-is-numpys-einsum-slower-than-numpys-built-in-functions –

+0

Das stimmt, aber meine Frage eher mit den beiden Indizes verwandt Fall. Die Antworten in diesem Post geben mir den Eindruck, dass es Probleme mit drei Indizes gibt. Ich war überrascht, dass der Geschwindigkeitsunterschied in diesem speziellen Beispiel so beeindruckend ist. – varantir

+3

Weil einsum geschrieben wird, um generisch zu sein, und nicht Sonderfall das zwei Indexpunktprodukt, um blas zu benutzen. Das ist wirklich das Endergebnis. Wenn Sie wissen, dass Sie nur zwei Indizes haben, verwenden Sie einfach Punkt. – BeRecursive

Antwort

2

einsum analysiert die Indexzeichenfolge und erstellt dann ein nditer-Objekt und verwendet dieses, um eine Produktsummeniteration durchzuführen. Es gibt spezielle Fälle, in denen die Indizes nur Achsen-Swaps und Summen ('ii-> i') ausführen. Es kann auch Sonderfälle für 2 und 3 Variablen geben (im Gegensatz zu mehr). Es wird jedoch nicht versucht, externe Bibliotheken aufzurufen.

Ich arbeitete eine reine Python Work-a-Like, aber mit mehr Fokus auf das Parsing als die Berechnung Sonderfälle.

tensordot umformt und tauscht, so kann es dot zu den tatsächlichen Berechnungen aufrufen.

Verwandte Themen