둘 이상의 코어를 사용하는 방법에 대한 답변이 이미 있지만 실제 문제는 루프를 작성하는 방식에 있습니다. 루프가 반복 될 때마다 결과 벡터 / 객체를 확장하지 마십시오 . 이 작업을 수행하면 R이 결과 벡터 / 오브젝트를 복사하고 시간이 걸리는 모든 것을 확장하도록 강제합니다. 대신, 루프를 시작하기 전에 충분한 저장 공간을 미리 할당하고 진행하십시오. 예를 들면 다음과 같습니다.
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
또는 다음을 통해 이러한 작업을 수행 할 수 있습니다 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
그러나 이것은 루프를 올바르게 수행하는 것보다 빠르지 않으며 때로는 느립니다.
그러나 항상 벡터화 된 코드를 찾으십시오. 다음을 사용하여 행 합 수단을 할 수있는 rowSums()및 rowMeans()빠른 루프 또는 하나 이상있는 apply버전 :
system.time({
p1max3 <- apply(p1, 1, max)
p1mean3 <- rowMeans(p1)
p1sum3 <- rowSums(p1)
})
user system elapsed
0.001 0.000 0.002
내가 베팅 한 사람이라면, foreach()매트릭스에 대한 속도 테스트에서 뛰 거나 다른 멀티 코어 옵션을 언급하는 세 번째 접근법에 돈을 벌게 될 것입니다. 서로 다른 CPU 코어에서 생성 된 별도의 프로세스
업데이트 : @ shabbychef의 의견에 따라 한 번만 합계를 계산하고 평균 계산에 재사용하는 것이 더 빠릅니까?
system.time({
p1max4 <- apply(p1, 1, max)
p1sum4 <- rowSums(p1)
p1mean4 <- p1sum4 / ncol(p1)
})
user system elapsed
0.002 0.000 0.002
이 테스트 실행에는 없지만 철저하지는 않습니다.