Sie haben bereits eine Antwort darauf, wie Sie mehr als einen Kern verwenden können, aber das eigentliche Problem liegt in der Art und Weise, wie Sie Ihre Schleifen geschrieben haben. Erweitern Sie niemals Ihren Ergebnisvektor / Objekt bei jeder Iteration einer Schleife . Wenn Sie dies tun, zwingen Sie R, Ihren Ergebnisvektor / Ihr Ergebnisobjekt zu kopieren und zu erweitern, was alles Zeit kostet. Weisen Sie stattdessen genügend Speicherplatz vorab zu, bevor Sie die Schleife starten, und füllen Sie diese bei Bedarf aus. Hier ist ein Beispiel:
set.seed(1)
p1 <- matrix(rnorm(10000), ncol=100)
system.time({
p1max <- p1mean <- p1sum <- numeric(length = 100)
for(i in seq_along(p1max)){
p1max[i] <- max(p1[i,])
p1mean[i] <- mean(p1[i,])
p1sum[i ]<- sum(p1[i,])
}
})
user system elapsed
0.005 0.000 0.005
Oder Sie können diese Dinge tun über apply()
:
system.time({
p1max2 <- apply(p1, 1, max)
p1mean2 <- apply(p1, 1, mean)
p1sum2 <- apply(p1, 1, sum)
})
user system elapsed
0.007 0.000 0.006
Beachten Sie jedoch, dass dies nicht schneller ist, als die Schleife ordnungsgemäß und manchmal langsamer auszuführen.
Achten Sie jedoch immer auf vektorisierten Code. Sie können Zeilensummen und Mittelwerte mitrowSums()
und rowMeans()
erstellen, die schneller als die Schleife oder die apply
Versionen sind:
system.time({
p1max3 <- apply(p1, 1, max)
p1mean3 <- rowMeans(p1)
p1sum3 <- rowSums(p1)
})
user system elapsed
0.001 0.000 0.002
Wenn ich ein Wettmann wäre, hätte ich Geld für den dritten Ansatz, den ich beim Schlagen erwähne, foreach()
oder für die anderen Optionen mit mehreren Kernen in einem Geschwindigkeitstest für Ihre Matrix, weil sie die Dinge erheblich beschleunigen müssten, um den Mehraufwand beim Einrichten der zu rechtfertigen separate Prozesse, die auf die verschiedenen CPU-Kerne verteilt werden.
Update: Nach dem Kommentar von @shabbychef ist es schneller, die Summen einmal zu machen und bei der Berechnung des Mittelwerts wiederzuverwenden?
system.time({
p1max4 <- apply(p1, 1, max)
p1sum4 <- rowSums(p1)
p1mean4 <- p1sum4 / ncol(p1)
})
user system elapsed
0.002 0.000 0.002
Nicht in diesem Testlauf, aber das ist alles andere als erschöpfend ...