Ho notato una cosa curiosa mentre lavoravo in R. Quando ho un semplice programma che calcola i quadrati da 1 a N implementati usando for-loop e while-loop il comportamento non è il stesso. (Non mi interessa la vettorizzazione in questo caso o applicare le funzioni).Per ciclo continuo mentre ciclo in R
fn1 <- function (N)
{
for(i in 1:N) {
y <- i*i
}
}
E
fn2 <- function (N)
{
i=1
while(i <= N) {
y <- i*i
i <- i + 1
}
}
I risultati sono:
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
Ora sappiamo che per-ciclo è più veloce, la mia ipotesi è a causa della pre assegnazione e ottimizzazioni lì. Ma perché trabocca?
UPDATE: Così ora cercando un altro modo con i vettori:
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
così forse il suo un problema di memoria funky? Sono in esecuzione su OS X con 4 GB di memoria e tutte le impostazioni predefinite in R. Ciò accade nelle versioni a 32 e 64 bit (tranne che le volte sono più veloci).
Alex
In base al tempo durante il quale il ciclo è più veloce. – Marek
quando convertite il contatore del ciclo for in un float, sarà più veloce del ciclo while, ma è solo perché il ciclo for non ha avvertimenti. – John
R è pieno di questo genere di assurdità. –