複数のコアを使用する方法については既に回答がありますが、実際の問題はループの記述方法にあります。ループの各反復で結果ベクトル/オブジェクトを拡張しないでください。これを行うと、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()
、マトリックスの速度テストでのビートまたは他のマルチコアオプションについて言及した3番目のアプローチにはお金があります。異なる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
この試運転ではありませんが、これは徹底的なものではありません...