Tôi đã nhận thấy một điều kỳ lạ khi làm việc trong R. Khi tôi có một chương trình đơn giản tính toán các ô từ 1 đến N được thực hiện bằng cách sử dụng vòng lặp và lặp lại hành vi không phải là tương tự. (Tôi không quan tâm đến vectorisation trong trường hợp này hoặc áp dụng các chức năng).Vòng lặp for-loop vs while trong R
fn1 <- function (N)
{
for(i in 1:N) {
y <- i*i
}
}
VÀ
fn2 <- function (N)
{
i=1
while(i <= N) {
y <- i*i
i <- i + 1
}
}
Kết quả là:
system.time(fn1(60000))
user system elapsed
2.500 0.012 2.493
There were 50 or more warnings (use warnings() to see the first 50)
Warning messages:
1: In i * i : NAs produced by integer overflow
.
.
.
system.time(fn2(60000))
user system elapsed
0.138 0.000 0.137
Bây giờ chúng ta biết rằng cho vòng lặp là nhanh hơn, tôi đoán là do phân bổ trước và optimisations đó. Nhưng tại sao nó tràn?
UPDATE: Bây giờ cố gắng một cách khác với vectơ:
fn3 <- function (N)
{
i <- 1:N
y <- i*i
}
system.time(fn3(60000))
user system elapsed
0.008 0.000 0.009
Warning message:
In i * i : NAs produced by integer overflow
Vì vậy, Có lẽ một vấn đề bộ nhớ sôi nổi của nó? Tôi đang chạy trên OS X với 4Gb bộ nhớ và tất cả các thiết lập mặc định trong R. Điều này xảy ra trong phiên bản 32 và 64 bit (ngoại trừ thời gian đó nhanh hơn).
Alex
Dựa trên thời gian trong khi vòng lặp của bạn nhanh hơn. – Marek
khi bạn chuyển đổi bộ đếm trong vòng lặp for thành float, nó sẽ nhanh hơn vòng lặp while nhưng nó chỉ vì vòng lặp for sau đó không có cảnh báo. – John
R là đầy đủ các loại vô nghĩa này. Tuy nhiên, –