Anda sudah mendapat jawaban tentang cara menggunakan lebih dari satu inti, tetapi masalah sebenarnya adalah dengan cara Anda menulis loop Anda. Jangan pernah memperluas vektor / objek hasil Anda di setiap iterasi dari satu loop . Jika Anda melakukan ini, Anda memaksa R untuk menyalin vektor hasil / objek Anda dan memperpanjangnya yang semuanya membutuhkan waktu. Alih-alih, pralokasi ruang penyimpanan yang cukup sebelum Anda memulai loop dan isi saat Anda melanjutkan. Berikut ini sebuah contoh:
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
Atau Anda dapat melakukan hal-hal ini melalui 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
Tetapi perhatikan bahwa ini tidak lebih cepat daripada melakukan loop dengan benar dan kadang-kadang lebih lambat.
Namun, selalu waspada terhadap kode vektor. Anda dapat melakukan jumlah baris dan cara menggunakan rowSums()
dan rowMeans()
mana yang lebih cepat daripada loop atau apply
versi:
system.time({
p1max3 <- apply(p1, 1, max)
p1mean3 <- rowMeans(p1)
p1sum3 <- rowSums(p1)
})
user system elapsed
0.001 0.000 0.002
Jika saya seorang pemain taruhan, saya akan mendapatkan uang untuk pendekatan ketiga yang saya sebut pemukulan foreach()
atau opsi multi-core lainnya dalam tes kecepatan pada matriks Anda karena mereka harus mempercepat banyak hal untuk membenarkan biaya overhead yang dikeluarkan dalam mengatur proses terpisah yang bertani core CPU yang berbeda.
Pembaruan: Mengikuti komentar dari @shabbychef apakah lebih cepat untuk melakukan penjumlahan sekali dan menggunakan kembali dalam perhitungan mean?
system.time({
p1max4 <- apply(p1, 1, max)
p1sum4 <- rowSums(p1)
p1mean4 <- p1sum4 / ncol(p1)
})
user system elapsed
0.002 0.000 0.002
Tidak dalam uji coba ini, tetapi ini masih jauh dari lengkap ...