Joan edukira

future.apply-rekin benchmarking-a egiten

·284 hitz·2 minutu
Urtzi Enriquez-Urzelai
Egilea
Urtzi Enriquez-Urzelai
Ekofisiologo ebolutiboa
R Tutorialak - Artikulu hau bilduma baten parte da.
Atala 1: Artikulu hau

Hiru Lehian kideak
#

  1. for begizta estandarra: Eskuzko iterazioa (aurre-esleitua).
  2. lapply: R-ko estandar funtzional eta sekuentziala.
  3. future_lapply: Bertsio paralelizatua.

1. Esperimentua: Zeregin “Merkea”
#

Eszenatoki honetan, oso azkar egiten den zerbait egingo dugu: 1.000 zenbakiren batez bestekoa kalkulatu.

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
)

# Taula sortu
kable(summary(bench_cheap), caption = "Zeregin merkearen emaitzak (milisegundoak)")
exprminlqmeanmedianuqmaxneval
for_loop1626.8341680.2411772.7181740.2021815.7452008.49110
standard_apply576.123589.8441079.011619.5821546.0172448.91510
future_apply42978.28344313.25568627.23070632.84978685.548117420.59210

Zeregin merkearen emaitzak (milisegundoak)

# Irudia sortu
autoplot(bench_cheap) +
  labs(title = "Zeregin merkea: Paralelizazioaren gainkarga nabaria da")

2. Esperimentua: Zeregin “Garestia”
#

Eszenatoki honetan, lan “astun” bat simulatuko dugu atzerapen txiki bat gehituz (Sys.sleep). Horrek modelizazio estatistiko konplexu bat edo web scraping-a imitatzen du.

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

# Deialdi bakoitzeko 0,1 segundo ematen dituen funtzioa
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 # Iterazio gutxi, motela baita!
)

# Taula sortu
kable(summary(bench_expensive), caption = "Zeregin garestiaren emaitzak (segundoak)")
exprminlqmeanmedianuqmaxneval
for_loop2009.28342009.28342012.17952012.17952015.07562015.07562
standard_apply2008.42172008.42172010.70832010.70832012.99502012.99502
future_apply293.2761293.2761296.5502296.5502299.8244299.82442

Zeregin garestiaren emaitzak (segundoak)

# Irudia sortu
autoplot(bench_expensive) +
  labs(title = "Zeregin garestia: Future-k alde handiz irabazten du")
R Tutorialak - Artikulu hau bilduma baten parte da.
Atala 1: Artikulu hau