Masz już odpowiedź, jak używać więcej niż jednego rdzenia, ale prawdziwy problem polega na sposobie pisania pętli. Nigdy nie rozszerzaj wektora wynikowego / obiektu przy każdej iteracji pętli . Jeśli to zrobisz, zmusisz R do skopiowania wektora wynikowego / obiektu i przedłużenia go, co zajmuje cały czas. Zamiast tego należy wstępnie przydzielić wystarczającą ilość miejsca do przechowywania przed rozpoczęciem pętli i wypełnić w miarę postępów. Oto przykład:
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
Lub możesz zrobić te rzeczy poprzez 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
Pamiętaj jednak, że nie jest to szybsze niż prawidłowe wykonanie pętli, a czasem wolniejsze.
Jednak zawsze szukaj kodu wektorowego. Można zrobić sum wierszy i sposoby korzystania rowSums()i rowMeans()które są szybsze niż jednej pętli lub applywersjach:
system.time({
p1max3 <- apply(p1, 1, max)
p1mean3 <- rowMeans(p1)
p1sum3 <- rowSums(p1)
})
user system elapsed
0.001 0.000 0.002
Gdybym był bukmacherem, miałbym pieniądze na trzecie podejście, o którym wspominam pokonanie, foreach()lub na inne wielordzeniowe opcje w teście prędkości na twojej matrycy, ponieważ musiałyby one znacznie przyspieszyć, aby uzasadnić narzut związany z konfiguracją oddzielne procesy wykonywane z różnych rdzeni procesora.
Aktualizacja: Czy po komentarzu z @shabbychef szybciej jest zrobić sumy raz i użyć ponownie w obliczeniu średniej?
system.time({
p1max4 <- apply(p1, 1, max)
p1sum4 <- rowSums(p1)
p1mean4 <- p1sum4 / ncol(p1)
})
user system elapsed
0.002 0.000 0.002
Nie w tym teście testowym, ale nie jest to wyczerpujące ...