He notado algo curioso mientras trabajo en R. Cuando tengo un programa simple que calcula cuadrados de 1 a N implementados usando for-loop y while-loop el comportamiento no es el mismo. (No me importa la vectorización en este caso o aplicar funciones).For-loop vs while loop en R
fn1 <- function (N)
{
for(i in 1:N) {
y <- i*i
}
}
Y
fn2 <- function (N)
{
i=1
while(i <= N) {
y <- i*i
i <- i + 1
}
}
Los resultados son los siguientes:
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
Ahora sabemos que para los de ciclo es más rápido, yo creo que es debido a la asignación previa y optimizaciones allí. Pero, ¿por qué se desborda?
ACTUALIZACIÓN: Así que ahora tratar de otra manera con vectores:
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
así que quizás es un problema de memoria cobarde? Me estoy ejecutando en OS X con 4 GB de memoria y todos los ajustes predeterminados en R. Esto sucede en las versiones de 32 y 64 bits (excepto que los tiempos son más rápidos).
Alex
Según el tiempo while-loop es más rápido. – Marek
cuando convierte el contador en el bucle for a un float, será más rápido que el bucle while, pero solo porque el bucle for no tiene advertencias. – John
R está lleno de este tipo de tonterías. –