Joan edukira
  1. Programazioa/
  2. R Programazioa/

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_loop1621.2071649.3171844.21601738.01251816.8312798.57610
standard_apply570.980572.757679.9542609.3615668.0301070.84710
future_apply41958.71144211.13066316.430645609.959591943.761131875.26210

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_loop2014.44712014.44712014.91192014.91192015.37662015.37662
standard_apply2009.72032009.72032011.62942011.62942013.53852013.53852
future_apply287.4234287.4234298.2098298.2098308.9962308.99622

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