Ir al contenido
  1. Programación/
  2. Programación en R/

Benchmarking de future.apply

·302 palabras·2 mins
Urtzi Enriquez-Urzelai
Autor
Urtzi Enriquez-Urzelai
Ecofisiólogo evolutivo
R Tutoriales - Este artículo es parte de una serie.
Parte 1: Este artículo

Los tres contendientes
#

  1. Bucle for estándar: Iteración manual (con pre-asignación).
  2. lapply: El estándar funcional y secuencial de R.
  3. future_lapply: La versión paralelizada.

Experimento 1: La tarea “barata” (ligera)
#

En este escenario, hacemos algo muy rápido: calcular la media de 1.000 números.

n <- 200
data_list <- replicate(n, rnorm(1000), simplify = FALSE)

bench_cheap <- microbenchmark(
  for_loop = {
    res_for <- vector("list", n)
    for (i in 1:n) res_for[[i]] <- mean(data_list[[i]])
  },
  standard_apply = lapply(data_list, mean),
  future_apply = future_lapply(data_list, mean),
  times = 10
)

# Generar tabla
kable(summary(bench_cheap), caption = "Resultados de la tarea ligera (milisegundos)")
exprminlqmeanmedianuqmaxneval
for_loop1533.6731594.0441715.97771696.5531849.9091960.73310
standard_apply581.569592.545632.0822607.935647.593769.92410
future_apply42645.68747242.44674838.421576065.54992860.346124832.58910

Resultados de la tarea ligera (milisegundos)

# Generar figura
autoplot(bench_cheap) +
  labs(title = "Tarea ligera: La sobrecarga del paralelo es visible")

Experimento 2: La tarea “cara” (pesada)
#

En este escenario, simulamos un trabajo “pesado” añadiendo un pequeño retardo (Sys.sleep). Esto imita el modelado estadístico complejo o el web scraping.

n_heavy <- 20
data_heavy <- replicate(n_heavy, rnorm(10), simplify = FALSE)

# Una función que tarda 0,1 segundos por llamada
heavy_func <- function(x) {
  Sys.sleep(0.1)
  mean(x)
}

bench_expensive <- microbenchmark(
  for_loop = {
    res_for <- vector("list", n_heavy)
    for (i in 1:n_heavy) res_for[[i]] <- heavy_func(data_heavy[[i]])
  },
  standard_apply = lapply(data_heavy, heavy_func),
  future_apply = future_lapply(data_heavy, heavy_func),
  times = 2 # ¡Pocas iteraciones porque es lento!
)

# Generar tabla
kable(summary(bench_expensive), caption = "Resultados de la tarea pesada (segundos)")
exprminlqmeanmedianuqmaxneval
for_loop2010.44192010.44192012.29962012.29962014.15722014.15722
standard_apply2008.57062008.57062008.88002008.88002009.18932009.18932
future_apply282.1072282.1072290.7669290.7669299.4266299.42662

Resultados de la tarea pesada (segundos)

# Generar figura
autoplot(bench_expensive) +
  labs(title = "Tarea pesada: Future gana por goleada")
R Tutoriales - Este artículo es parte de una serie.
Parte 1: Este artículo