Betrachte zwei ndarrays
der Länge n
, arr1
und arr2
. Ich berechne die folgende Summe von Produkten und teste es num_runs
mal zum Benchmark:
Die Ausgabe ist
%Vor%so erscheint die Verwendung des Listenverständnisses schneller.
Gibt es eine viel effizientere Implementierung, vielleicht mit Numpy-Routinen, um eine solche Summe von Produkten zu berechnen?
Ordnen Sie die Operation in einen O (n) Laufzeitalgorithmus statt O (n ^ 2), und nutzen Sie NumPy für die Produkte und Summen:
%Vor% Das Timing zeigt, dass es 200 mal schneller ist als das Listenverständnis für n == 100
.
Ein vektorisierter Weg: np.sum(np.triu(np.multiply.outer(arr1,arr2),1))
.
für eine 30-fache Verbesserung:
%Vor%Ein weiterer schneller Ansatz ist die Verwendung von numba:
%Vor%für einen 10-fachen neuen Faktor:
%Vor%Und benutze @ user2357112 minimale Antwort,
%Vor%für
%Vor%, machen Sie einfach die notwendigen Operationen.
Sie können den folgenden Übertragungstrick verwenden:
%Vor% Grundsätzlich bezahle ich den Preis für die paarweise Berechnung des Produkts aller Elemente in arr1
und arr2
, um die Geschwindigkeit der numply broadcasting / vectorization zu nutzen, die im Low-Level-Code viel schneller erledigt wird.
Und Timings:
%Vor%