R. çalışırken ilginç bir şey fark ettim For döngüsü ve while-döngüsü kullanılarak uygulanan 1'den N'ye kadar kareleri hesaplayan basit bir programım olduğunda, davranış aynı. (Bu durumda vektörleştirmeyi umursamıyorum veya işlevleri uygula). For-loop vs while döngü içinde R
fn2 <- function (N)
{
i=1
while(i <= N) {
y <- i*i
i <- i + 1
}
}
fn1 <- function (N)
{
for(i in 1:N) {
y <- i*i
}
}
VE
sonuçlar şöyle: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
Şimdi döngü için-hızlıdır, benim tahminim çünkü orada ön tahsisi ve optimizasyonlar sonucunda olduğunu biliyoruz. Ama neden taşıyor?
GÜNCELLEME:
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
Yani belki onun bir korkak bellek sorunu: Şimdi vektörler ile başka bir yol çalışıyor? OS X'de 4Gb bellek ve R'deki tüm varsayılan ayarlar ile çalışıyorum. Bu 32 ve 64-bit sürümlerde gerçekleşir (bu süreler daha hızlıdır).
Alex
Zamanlama süresine bağlı olarak, döngü daha hızlıdır. – Marek
Sayacı for döngüsünde bir float'a dönüştürdüğünüzde while döngüsünden daha hızlı olacaktır, ancak bunun nedeni for döngüsünün hiçbir uyarısı olmamasıdır. – John
R, bu tür saçmalıklarla doludur. –