Zauważyłem ciekawą rzecz podczas pracy w R. Kiedy mam prosty program, który oblicza kwadraty od 1 do N zaimplementowane za pomocą pętli for i pętli while, zachowanie nie jest podobnie. (Nie interesuje mnie wektoryzacja w tym przypadku lub zastosowanie funkcji).For-loop vs while loop w R
fn1 <- function (N)
{
for(i in 1:N) {
y <- i*i
}
}
I
fn2 <- function (N)
{
i=1
while(i <= N) {
y <- i*i
i <- i + 1
}
}
Wyniki są następujące:
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
Teraz wiemy, że pętla jest szybsza, domyślam się, ponieważ wstępnego przydziału i optymalizacji tam. Ale dlaczego to się przelewa?
UPDATE: Więc teraz próbuje w inny sposób z wektorami:
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
więc może jego funky problem pamięci? Używam systemu OS X z 4 GB pamięci i wszystkimi domyślnymi ustawieniami w R. Zdarza się to w wersjach 32- i 64-bitowych (poza tym, że czasy są szybsze).
Alex
Na podstawie czasu wykonywania pętli while jest szybszy. – Marek
po konwersji licznika w pętli for na float będzie on szybszy niż pętla while, ale dzieje się tak tylko dlatego, że pętla for nie ma wtedy żadnych ostrzeżeń. – John
R jest pełen tego rodzaju nonsensów. –