Effiziente Doppelsumme von Produkten

7

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:

%Vor%

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?

    
bcf 24.05.2016, 14:48
quelle

3 Antworten

12

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 .

%Vor%     
user2357112 24.05.2016, 15:26
quelle
8

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.

    
B. M. 24.05.2016 15:02
quelle
3

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%     
JoshAdel 24.05.2016 15:01
quelle

Tags und Links