Why is apply() method slower than a for loop in R?

前端 未结 5 1519
既然无缘
既然无缘 2020-11-27 04:55

As a matter of best practices, I\'m trying to determine if it\'s better to create a function and apply() it across a matrix, or if it\'s better to simply loop a

5条回答
  •  醉话见心
    2020-11-27 05:53

    Better example for speed advantage of for loop.

    for_loop <- function(x){
        out <- vector(mode="numeric",length=NROW(x))
        for(i in seq(length(out)))
            out[i] <- max(x[i,])
        return(out)
        }
    
    apply_loop <- function(x){
        apply(x,1,max)
    }
    
    million  <- matrix(rnorm(1000000),ncol=10)
    > system.time(apply_loop(million))
      user  system elapsed 
      0.57    0.00    0.56 
    > system.time(for_loop(million))
      user  system elapsed 
      0.32    0.00    0.33 
    

    EDIT

    Version suggested by Eduardo.

    max_col <- function(x){
        x[cbind(seq(NROW(x)),max.col(x))]
    }
    

    By row

    > system.time(for_loop(million))
       user  system elapsed 
       0.99    0.00    1.11 
    > system.time(apply_loop(million))
      user  system elapsed 
       1.40    0.00    1.44 
    > system.time(max_col(million))
      user  system elapsed 
      0.06    0.00    0.06 
    

    By column

    > system.time(for_loop(t(million)))
      user  system elapsed 
      0.05    0.00    0.05 
    > system.time(apply_loop(t(million)))
      user  system elapsed 
      0.07    0.00    0.07 
    > system.time(max_col(t(million)))
      user  system elapsed 
      0.04    0.00    0.06 
    

提交回复
热议问题