Ist die Reihenfolge der Schleifen wichtig für die Geschwindigkeit in R?

8

Ich habe ein Problem, bei dem ich eine Simulationsstudie durchführen möchte, bei der die Simulation von zwei Variablen x und y abhängt. x und y sind Vektoren von potentiellen Werten, die ich in meiner Simulationsstudie auswerten möchte (also unterschiedliche Kombinationen). Außerdem möchte ich für jede Kombination von x und y mehrere Replikate (da ein stochastischer Ausdruck darin enthalten ist und jeder Durchlauf von x und y variiert).

Um ein Beispiel zu geben, mit dem ich es zu tun habe, habe ich das folgende vereinfachte Beispiel:

%Vor%

In meinem eigentlichen Problem ist der Code, der innerhalb der for-Schleife ausgewertet wird, jedoch viel weniger trivial zu bewerten. Die Struktur meiner Eingaben ist jedoch dieselbe wie die der Ausgabe.

Was ich gerne wissen würde, sagen wir anhand des obigen Beispiels, ist es am effizientesten, die Loops in dieser Reihenfolge einzurichten, oder wäre es besser, k in 1:iterations die äußerste Schleife zu sein und zu versuchen, irgendeine Art von zu verwenden outer() -Befehl innerhalb dieser 1 Schleife, da ich die Funktion ( z in diesem Beispiel) über das Gitter x und y ?

auswerte

Ich bin auch sehr offen für ein komplett anderes Setup und Design. Am Ende des Tages möchte ich in der Lage sein, eine Lösung zu erhalten, die auf x und y basiert und über alle Iterationen gemittelt wird, d.h. apply(solution, c(1,2),mean)

Bearbeiten:

Wie mir vorgeschlagen wurde, ist hier der eigentliche Code, den ich verwende.

%Vor%     
RustyStatistician 24.03.2016, 18:37
quelle

2 Antworten

7

Ja, ich glaube, dass es theoretisch einen Unterschied machen sollte (siehe Beispiel unten).

R verwendet die Spaltenhauptordnung wie Fortran (und im Gegensatz zu C). Um Cache-Fehler zu minimieren, sollten Sie also Spalten durchqueren. Um eine Matrix zu füllen, ist der optimale Ansatz derjenige, bei dem die äußere Schleife unseren Spaltenindex aufweist.

Und für n-dimensionale Arrays sollten Sie dies auch im Hinterkopf behalten. In dem Fall, dass n = 3 , ich denke, dies würde bedeuten, dass die Schicht die äußerste Schleife ist, dann die Spalte, dann die Zeile. Ich könnte mich aber hier irren.

Ich habe dieses schnelle Beispiel mit 5000 by 5000 matrices ausgeführt. Und wir sehen einen Unterschied von ungefähr 50 Sekunden, wobei fill_matrix2() schneller ist.

%Vor%     
paulstey 24.03.2016 19:20
quelle
4

Die Reihenfolge der Schleifen ist hier praktisch nicht relevant. Wenn Sie Ihren Code profilieren (siehe help("Rprof") ), sehen Sie, dass die CPU-Zeit in Funktionen wie survfit und coxph verbracht wird. Und natürlich wächst out , was Sie vermeiden sollten. Weisen Sie out der endgültigen Größe zu und füllen Sie sie, anstatt sie zu vergrößern.

    
Roland 25.03.2016 17:59
quelle

Tags und Links