Ir al contenido

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_loop1526.1061660.5581737.21131724.87301767.8772058.76210
standard_apply581.668600.766683.3103610.2285644.5661329.65110
future_apply42850.04846636.70172920.284270995.910587396.966139938.64910

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.30022010.30022012.2492012.2492014.19752014.19752
standard_apply2008.01482008.01482008.3132008.3132008.61062008.61062
future_apply286.0831286.0831288.471288.471290.8588290.85882

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