Ich möchte die Leistung von Convolution mit Python verbessern und hoffe auf einige Einblicke, wie man am besten die Leistung verbessern kann.Verbessern der Leistung von Numpy
ich derzeit scipy bin mit der Faltung auszuführen, Code etwas wie das Snippet unten:
import numpy
import scipy
import scipy.signal
import timeit
a=numpy.array ([ range(1000000) ])
a.reshape(1000,1000)
filt=numpy.array([ [ 1, 1, 1 ], [1, -8, 1], [1,1,1] ])
def convolve():
global a, filt
scipy.signal.convolve2d (a, filt, mode="same")
t=timeit.Timer("convolve()", "from __main__ import convolve")
print "%.2f sec/pass" % (10 * t.timeit(number=10)/100)
I-Bilddaten am Verarbeitung, Graustufen (ganzzahlige Werte zwischen 0 und 255) verwendet wird, und ich zur Zeit bekommen etwa eine viertel Sekunde pro Faltung. Mein Gedanke war, einen der folgenden zu tun:
Verwenden Sie corpy, vorzugsweise mit einigen Optimierungen Kompilieren Sie numpy mit icc & ikml. Verwenden Sie Python-Cuda.
Ich fragte mich, ob irgendjemand irgendwelche Erfahrung mit irgendeinem dieser Ansätze hatte (welche Art von Gewinn wäre typisch, und wenn es die Zeit wert ist), oder wenn jemand eine bessere Bibliothek zur Durchführung von Faltung mit Numpy kennt.
Danke!
EDIT:
Geschwindigkeit aus etwa 10-fach durch Umschreiben Python Schleife in C über Numpy verwenden.
Danke, dass Sie darauf hingewiesen haben, ich hätte nicht gedacht, dass die Scipy Convolve so ineffizient sein könnte. Es sieht so aus, obwohl ich das nicht genau überprüft habe, dass Scipy Convolve ziemlich viele Speichermanipulationsoperationen durchführt und eine Anzahl von if-Anweisungen die Dinge verlangsamt. Ich werde die Ergebnisse posten und danke Ihnen allen für Ihre Kommentare. – Bear
Ja, convolve2d ist ziemlich ineffizient, da es sich um den allgemeinen Fall handelt (es handelt sich um willkürliche Objekte - Sie sollten zum Beispiel mit einem Array von Dezimal-Objekten falten können). Ich denke, dass es erheblich beschleunigt werden könnte, indem spezielle Codepaths für den allgemeinen Fall verwendet werden (insbesondere, um den Funktionszeiger-Aufruf innerhalb der Dreifachschleife zu vermeiden, der sehr wahrscheinlich einer der Hauptrollen ist. –