Gần đây tôi đã trả lời một câu hỏi liên quan đến các vòng for
. Sau khi kiểm tra tốc độ mã của tôi, tôi nhận thấy rằng việc sử dụng seq()
như trái ngược với :
trong vòng lặp for
làm chậm tốc độ xuống đáng kể.Tại sao seq (x) chậm hơn rất nhiều so với 1: độ dài (x)?
Hãy xem ví dụ rất đơn giản này. Sự khác biệt duy nhất giữa f1()
và f2()
là thay đổi trong chuỗi vòng lặp for
, nhưng f1()
nhanh hơn hai lần là f2()
.
f1 <- function() {
x <- 1:5; y <- numeric(length(x))
for(i in 1:length(x)) y[i] <- x[i]^2
y
}
f2 <- function() {
x <- 1:5; y <- numeric(length(x))
for(i in seq(x)) y[i] <- x[i]^2
y
}
library(microbenchmark)
microbenchmark(f1(), f2())
# Unit: microseconds
# expr min lq median uq max neval
# f1() 10.529 11.5415 12.1465 12.617 33.893 100
# f2() 25.052 25.5905 26.0385 28.759 78.553 100
Tại sao seq(x)
nên chậm hơn trong một vòng lặp hơn 1:length(x)
for
?