Was ist der effiziente Weg, um zwei Arrays zu multiplizieren und die Summe der Multiplikationswerte in Ruby zu erhalten? Ich habe zwei Arrays in Ruby:
%Vor%Mein Ziel ist es, den Summenwert von array_A * array_B zu erhalten, d. h. 1 * 3 + 2 * 2 + 1 * 4 + ... + 8 * 5 + 9 * 4.
Weil ich sie in meinen Apps millionenfach berechnen muss, was ist der effizienteste Weg, um solche Berechnungen durchzuführen?
Es ist wie eine Matrixberechnung: 1 * N Matrix * N * 1 Matrix oder ein Vektor-Skalarprodukt.
Aktualisieren
Ich habe gerade Benchmarks nach neuen Kommentaren aktualisiert. Nach Joshuas Kommentar , die inject-Methode wird um 25% beschleunigt, siehe array walking without to_a
in der Tabelle unten.
Da jedoch die Geschwindigkeit das primäre Ziel für das OP ist, haben wir ein neuer Gewinner für den Wettbewerb , der die Laufzeit von .34
auf .22
in meinen Benchmarks reduziert.
Ich bevorzuge immer noch inject
method, weil es rubinischer ist, aber wenn Geschwindigkeit zählt, dann scheint die while-Schleife der richtige Weg zu sein.
Neue Antwort
Sie können immer alle diese Antworten benchmarken, ich habe es aus Neugierde gemacht:
%Vor% Einfaches Array-Gehen gewinnt, die Matrix-Methode ist schlechter, weil sie die Objekt-Instanziierung enthält. Ich denke, wenn Sie die inject
while
-Methode schlagen wollen (um hier eine Grössenordnung am schnellsten zu erreichen), müssen Sie eine C
-Erweiterung implementieren und sie in Ihrem Ruby-Programm binden .
Hier ist das Skript, das ich benutzt habe
%Vor%Da Geschwindigkeit unser Hauptkriterium ist, werde ich diese Methode gemäß den Benchmarks von Peter als schnellste einreichen.
%Vor%Probieren Sie den NMatrix Edelstein aus. Es ist eine numerische Berechnungsbibliothek. Ich denke, es verwendet die gleichen C- und C ++ - Bibliotheken, die Octave und Matlab verwenden.
Sie könnten die Matrix-Multiplikation wie folgt machen:
%Vor%Ich bin nicht sicher, wie die Geschwindigkeit mit reinem Ruby verglichen wird, aber ich stelle mir vor, dass es schneller ist, besonders für große und spärliche Vektoren.
BEARBEITEN: Vektor ist nicht am schnellsten (Marc Bollinger hat völlig Recht).
Hier ist der modifizierte Code mit Vektor und n-mal:
%Vor%Und die Ergebnisse:
%Vor%Schade. : (