Почему метод apply () медленнее, чем цикл for в R?

В соответствии с передовой практикой я пытаюсь определить, действительно ли это » Лучше создать функцию и apply () ее по матрице, или, если лучше, просто пропустить матрицу по функции. Я попробовал оба способа и был удивлен, обнаружив, что apply () работает медленнее. Задача состоит в том, чтобы взять вектор и оценить его как положительный или отрицательный, а затем вернуть вектор с 1, если он положительный, и -1, если он отрицательный. Функция mash () выполняет цикл, а функция squish () передается в функцию apply () .

million  <- as.matrix(rnorm(100000))

mash <- function(x){
  for(i in 1:NROW(x))
    if(x[i] > 0) {
      x[i] <- 1
    } else {
      x[i] <- -1
    }
    return(x)
}

squish <- function(x){
  if(x >0) {
    return(1)
  } else {
    return(-1)
  }
}


ptm <- proc.time()
loop_million <- mash(million)
proc.time() - ptm


ptm <- proc.time()
apply_million <- apply(million,1, squish)
proc.time() - ptm

loop_million результаты:

user  system elapsed 
0.468   0.008   0.483 

] apply_million результаты:

user  system elapsed 
1.401   0.021   1.423 

В чем преимущество использования apply () по сравнению с циклом for , если производительность снижается? Есть ли в моем тесте изъян? Я сравнил два получившихся объекта и обнаружил:

> class(apply_million)
[1] "numeric"
> class(loop_million)
[1] "matrix"

Что только усугубляет загадку. Функция apply () не может принимать простой числовой вектор, поэтому я преобразовал ее с помощью as.matrix () в начале. Но тогда он возвращает числовое значение. Цикл for подходит для простого числового вектора. И он возвращает объект того же класса, что и переданный ему.

21
задан Navy Cheng 14 January 2019 в 04:58
поделиться