For-Schleife vs While-Schleife in R
Habe ich bemerkt, eine seltsame Sache, die während Ihrer Arbeit in R.
Wenn ich ein einfaches Programm, das berechnet die Quadrate von 1 bis N, implementiert unter Verwendung von for-Schleife und while-Schleife, das Verhalten ist nicht das gleiche. (I don ' T care über Vektorisierung in diesem Fall oder anwenden von Funktionen).
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
}
}
Sind die Ergebnisse:
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
Nun wissen wir, dass die for-Schleife ist schneller, meine Vermutung ist, da der pre-Allokation und Optimierungen gibt. Aber warum ist es überlaufen?
UPDATE: So, jetzt versuchen einen anderen Weg 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 Vielleicht seine eine funky Speicher-Problem? Ich bin unter OS X mit 4Gb Speicher und alle Standard-Einstellungen in R. Dies geschieht in 32 - und 64-bit-Versionen (außer, die Zeiten sind schneller).
Alex
InformationsquelleAutor der Frage Alex | 2010-11-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil
1
ist numerisch, aber nicht ganzzahlig, d.h. es ist eine floating-point-Zahl), und1:6000
ist numeric und integer.60000 Quadrat 3,6 Milliarden, die NICHT Darstellbare vorzeichenbehaftete 32-bit-Ganzzahl, daher bekommen Sie einen überlauf-Fehler:
3,6 Milliarden ist leicht darstellbar, in floating point, aber:
Reparieren Ihre
for
- code, konvertieren, um eine floating-point-Darstellung:InformationsquelleAutor der Antwort Alex Brown
Die variable in der for-Schleife eine integer-Sequenz, und so schließlich Sie dies tun:
in der Erwägung, dass in der while-Schleife erstellen Sie eine floating-point-Zahl.
Ist auch der Grund, warum diese Dinge sind anders:
Mir nicht glauben?
weil:
InformationsquelleAutor der Antwort Spacedman
Und über das timing:
Und jetzt wissen wir, dass die for-Schleife ist schneller als die while-Schleife. Sie können nicht ignorieren Warnungen, die während des timing.
InformationsquelleAutor der Antwort Marek