Ich habe eine seltsame Sache bemerkt, während der Arbeit in R. Wenn ich ein einfaches Programm, das Quadrate von 1 bis N implementiert mit For-Schleife und While-Schleife das Verhalten ist nicht die gleich. (In diesem Fall ist mir die Vektorisierung egal, oder Funktionen anwenden).For-Schleife vs While-Schleife in R
fn1 <- function (N)
{
for(i in 1:N) {
y <- i*i
}
}
UND
fn2 <- function (N)
{
i=1
while(i <= N) {
y <- i*i
i <- i + 1
}
}
Die Ergebnisse sind:
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
Jetzt wissen wir, dass für-Schleife schneller, meine Vermutung wegen pre Zuteilung ist und dort Optimierungen. Aber warum ist es übergelaufen?
UPDATE: Versuch also nun eine andere Art und Weise mit Vektoren:
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
So sein Vielleicht ein flippiges Speicherproblem? Ich laufe auf OS X mit 4 GB Speicher und allen Standardeinstellungen in R. Dies geschieht in 32- und 64-Bit-Versionen (außer dass die Zeiten sind schneller).
Alex
Basierend auf Ihrem Timing While-Loop ist schneller. – Marek
Wenn Sie den Zähler in der for-Schleife in einen Gleitkomma konvertieren, wird es schneller als die while-Schleife, aber nur, weil die for-Schleife dann keine Warnungen hat. – John
R ist voll von dieser Art von Unsinn. –