2015-09-07

Comparar el tiempo de ejecución de expresiones en R con microbenchmark

Title

Problema

Queremos evaluar el tiempo de ejecución de varias expresiones en R. Partimos del ejemplo de la entrada anterior, en la que seleccionábamos un porcentajes de filas de un data frame mediante diferentes métodos.

Utilizamos el conjunto de datos ToothGrowth, que cuenta con 60 filas. Lo partiremos en dos, la primera con un 70% de las filas (42) y la segunda con un 30% (18 filas). Aunque en este ejemplo no es necesario, empleamos la función round, para que en el caso de que por ejemplo el número de filas sea 6,6 devuelva 7 filas en lugar de 6.

Opciones

  • head y tail
  • head(ToothGrowth, round(nrow(ToothGrowth)*0.7))
    tail(ToothGrowth, round(nrow(ToothGrowth)*0.3))
    
  • Filtrando con índices
  • porcentaje = round(0.7*nrow(ToothGrowth))
    ToothGrowth[1:porcentaje,]
    ToothGrowth[-(1:porcentaje),]
    
  • Usando dplyr
  • porcentaje = round(0.7*nrow(ToothGrowth))
    library(dplyr)
    slice(ToothGrowth, 1:porcentaje)
    slice(ToothGrowth, -(1:porcentaje))

    Medición

    library(microbenchmark)
    library(ggplot2)
    porcentaje <-  round(0.7*nrow(ToothGrowth))
    rdo <- microbenchmark(
      opcion1 = head(ToothGrowth, round(nrow(ToothGrowth) * 0.7)),
      opcion2 = ToothGrowth[1:porcentaje,],
      opcion3 = slice(ToothGrowth, 1:porcentaje))
    
    Cargamos microbenchmark para la medición y ggplot2 para la representación gráfica. Separamos cada expresión que deseamos evaluar por una coma. Por defecto microbenchmark ejecuta cada expresión 100 veces (neval en el resultado). Para modificar el número de veces incluimos el argumento times.

    Resultado

    rdo
    
    Unit: microseconds
        expr     min       lq      mean    median       uq      max neval
     opcion1 134.933  147.156  203.3685  179.6675  225.867 1017.378   100
     opcion2  98.756  105.112  138.9135  116.3565  161.334  418.490   100
     opcion3 978.756 1026.912 1096.2901 1056.2450 1087.289 3765.912   100
    
    Los resultados incluyen 8 columnas. El mínimo (min), cuartil inferior (lq), media (mean) ,mediana (median), cuartil superior (uq), y máximo (max). Nos centraremos en la mediana, y en los cuartiles inferior y superior (lq y uq) para hacernos una idea de la variabilidad. En nuestro ejemplo vemos que la mejor opción en todos los parámetros y con menor variabilidad es la opción 2. También debemos prestar atención a la unidad de medida, antes de las columnas con los resultados, en nuestro ejemplo microsegundos.

    Gráfico

    Generamos un gráfico de tipo violín con los resultados de la medición.

    autoplot(rdo)
    

    Entradas relacionadas

    Referencias

    No hay comentarios:

    Publicar un comentario

    Nube de datos