Bạn đã có câu trả lời về cách sử dụng nhiều hơn một lõi, nhưng vấn đề thực sự nằm ở cách bạn viết các vòng lặp. Không bao giờ mở rộng vectơ kết quả / đối tượng của bạn tại mỗi lần lặp của một vòng lặp . Nếu bạn làm điều này, bạn buộc R sao chép vectơ / đối tượng kết quả của bạn và mở rộng nó mà tất cả đều mất thời gian. Thay vào đó, hãy phân bổ đủ không gian lưu trữ trước khi bạn bắt đầu vòng lặp và điền vào khi bạn đi cùng. Đây là một ví dụ:
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
Hoặc bạn có thể làm những điều này thông qua 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
Nhưng lưu ý rằng đây là không nhanh hơn làm vòng lặp đúng và đôi khi chậm hơn.
Tuy nhiên, luôn luôn đề phòng mã vector. Bạn có thể thực hiện tổng hàng và phương tiện bằng cách sử dụng rowSums()và rowMeans()nhanh hơn so với vòng lặp hoặc applyphiên bản:
system.time({
p1max3 <- apply(p1, 1, max)
p1mean3 <- rowMeans(p1)
p1sum3 <- rowSums(p1)
})
user system elapsed
0.001 0.000 0.002
Nếu tôi là người cá cược, tôi sẽ có tiền cho cách tiếp cận thứ ba mà tôi đề cập đến việc đánh bại foreach()hoặc các tùy chọn đa lõi khác trong bài kiểm tra tốc độ trên ma trận của bạn bởi vì họ sẽ phải tăng tốc đáng kể để biện minh cho chi phí phát sinh trong việc thiết lập các quy trình riêng biệt được trang bị các lõi CPU khác nhau.
Cập nhật: Theo nhận xét từ @shabbychef, có nhanh hơn để thực hiện các khoản tiền một lần và sử dụng lại trong tính toán của giá trị trung bình không?
system.time({
p1max4 <- apply(p1, 1, max)
p1sum4 <- rowSums(p1)
p1mean4 <- p1sum4 / ncol(p1)
})
user system elapsed
0.002 0.000 0.002
Không phải trong lần chạy thử này, nhưng điều này còn lâu mới ...