Ich möchte den folgenden Ausdruck in Python implementieren: wobei x und y numpy Arrays der Größe n sind und k ein numpy Array ist der Größe n × n . Die Größe n kann bis zu 10000 betragen, und die Funktion ist Teil einer inneren Schleife, die viele Male ausgewertet wird. Daher ist die Geschwindigkeit wichtig.
Idealerweise würde ich eine for-Schleife gerne ganz vermeiden, obwohl ich denke, dass es nicht das Ende der Welt ist, wenn es eine gibt. Das Problem ist, dass ich Probleme habe, es ohne ein paar verschachtelte Schleifen zu machen, und das wird es wahrscheinlich ziemlich langsam machen.
Kann jemand sehen, wie man die obige Gleichung mit numpy effizient und vorzugsweise auch lesbar ausdrückt? Was ist im Allgemeinen der beste Weg, um so etwas anzugehen?
Antworten:
Hier ist die Numba-Lösung. Auf meinem Computer ist die Numba-Version> 1000x schneller als die Python-Version ohne Dekorator (für eine 200x200-Matrix 'k' und einen 200-Längen-Vektor 'a'). Sie können auch den @autojit-Dekorator verwenden, der etwa 10 Mikrosekunden pro Aufruf hinzufügt, sodass derselbe Code mit mehreren Typen funktioniert.
Offenlegung: Ich bin einer der Numba-Entwickler.
quelle
Hier ist ein Anfang. Erstens entschuldige ich mich für etwaige Fehler.
Bearbeiten: Nein, die Obergrenze war korrekt, wie in der Frage angegeben. Ich habe es so belassen, wie es hier ist, da eine andere Antwort jetzt denselben Code verwendet, aber die Korrektur ist einfach.
Zuerst eine geloopte Version:
Ich habe es zu einer einzigen Schleife mit numpy Slices gemacht:
Dann habe ich eine Cython-Version des (besser lesbaren) geloopten Codes geschrieben.
Auf meinem Laptop ist dieser etwa 200x schneller als die geloopte Version (und 8x schneller als die vektorisierte 1-Loop-Version). Ich bin sicher, andere können es besser machen.
Ich habe mit einer Julia-Version gespielt und es schien (wenn ich es richtig zeitlich abgestimmt habe) mit dem Cython-Code vergleichbar zu sein.
quelle
Was Sie wollen, scheint eine Faltung zu sein; Ich denke, der schnellste Weg, dies zu erreichen, ist die
numpy.convolve
Funktion.Möglicherweise müssen Sie die Indizes entsprechend Ihren Anforderungen anpassen, aber ich denke, Sie möchten Folgendes ausprobieren:
quelle