Я заметил любопытную вещь во время работы в R. Когда у меня есть простая программа, которая вычисляет квадраты от 1 до N, реализованные с использованием for-loop и while-loop, поведение не одинаково.(Меня не волнует векторизация в этом случае или применение функций).
fn1 <- function (N)
{
for(i in 1:N) {
y <- i*i
}
}
AND
fn2 <- function (N)
{
i=1
while(i <= N) {
y <- i*i
i <- i + 1
}
}
Результаты:
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
Теперь мыЯ знаю, что цикл for быстрее, я думаю, из-за предварительного выделения и оптимизации там.Но почему это переполняется?
ОБНОВЛЕНИЕ: Итак, теперь попробуем другой способ с векторами:
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
Так, может быть, это проблема с памятью?Я работаю на OS X с 4 ГБ памяти и всеми настройками по умолчанию в R. Это происходит в 32- и 64-разрядных версиях (за исключением того, что время быстрее).
Alex