Ich habe es mit einer großen Menge von Daten zu tun, und ich mache mir Sorgen über die Effizienz meiner Operationen im Maßstab. Nach dem Benchmarking beträgt die durchschnittliche Ausführungszeit für diesen Code ca. 0,004 Sekunden. Das Ziel dieser Codezeile besteht darin, den Unterschied zwischen den beiden Werten in jeder Array-Position zu finden. In einer vorherigen Operation wurde 111.111 in die Arrays an Orten geladen, die ungültige Daten enthielten. Aufgrund einiger seltsamer Zeitdomänenprobleme musste ich dies tun, da ich die Werte nicht einfach entfernen konnte und einen unterscheidbaren Platzhalter benötigte. Ich könnte wahrscheinlich stattdessen 'Nil' hier verwenden. Wie auch immer, zurück zur Erklärung. Diese Codezeile prüft, ob keines der Arrays diesen 111.111-Platzhalter am aktuellen Speicherort besitzt. Wenn die Werte gültig sind, führe ich die mathematische Operation aus, ansonsten möchte ich die Werte löschen (oder sie zumindest aus dem neuen Array ausschließen, in das ich schreibe). Ich habe dies erreicht, indem ich an dieser Stelle einen Nullpunkt platziert habe und das Array anschließend komprimiert habe.Ruby: Steigerung der Effizienz
Die Zeit von 0,004 Sekunden für 4000 Datenpunkte in jedem Array ist nicht schrecklich, aber diese Codezeile wird 25M mal ausgeführt. Ich hoffe, dass jemand einen Einblick geben könnte, wie ich diese Codezeile optimieren könnte.
temp_row = row_1.zip(row_2).map do |x, y|
x == 111.111 || y == 111.111 ? nil : (x - y).abs
end.compact
'zip' wird hier nicht benötigt. –
Und ja, 4000% Verbesserung durch das Erstellen von 5000 Threads - das ist Fantasie :) –
Ohne zip: http://pastie.org/10881223 –