คุณได้รับคำตอบเกี่ยวกับวิธีใช้มากกว่าหนึ่งคอร์ แต่ปัญหาที่แท้จริงคือวิธีที่คุณเขียนลูป ไม่เคยขยายผลของเวกเตอร์ / วัตถุที่ทวนของวงแต่ละคน หากคุณทำเช่นนี้คุณบังคับให้ 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
แต่โปรดทราบว่านี่ไม่เร็วไปกว่าการวนซ้ำอย่างถูกต้องและช้าลง
อย่างไรก็ตามควรมองหารหัส vectorised เสมอ คุณสามารถทำผลรวมแถวและวิธีการใช้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
ไม่ได้อยู่ในการทดสอบนี้ แต่มันยังห่างไกลจากความครบถ้วนสมบูรณ์ ...