Улучшить производительность этого скрипта - PullRequest
0 голосов
/ 22 марта 2020

Вот фрагмент моего кода, который я представляю в приложении R глянцевый, но который отнимает у меня много времени, потому что я выполняю его в реактивной функции, которую затем вызываю пять раз для другой графики.

У вас есть идея улучшить скорость этого скрипта?

Я уже пытался выполнить это с мурлыканием, но я не достаточно хорошо освоил этот инструмент.

Вот воспроизводимый пример

library(profvis)
profvis({

#dataframe created for the example

DF<- data.frame("scan"=seq(1:7518),"dye1"=NA,"dye2"=NA,"dye3"=NA,"dye4"=NA,"dye5"=NA,"dye6"=NA)
DF$dye1 <- sample(100, size = nrow(DF), replace = TRUE)
DF$dye2 <- sample(100, size = nrow(DF), replace = TRUE)
DF$dye3 <- sample(100, size = nrow(DF), replace = TRUE)
DF$dye4 <- sample(100, size = nrow(DF), replace = TRUE)
DF$dye5 <- sample(100, size = nrow(DF), replace = TRUE)
DF$dye6 <- sample(100, size = nrow(DF), replace = TRUE)


#slowness begins here

for (d in 3000:7518){

  #array of input data
  input <- numeric(1206)

  for (i in -100:100){
    input[1+i+100] <- DF$dye1[d + i]
    input[202+i+100] <- DF$dye2[d + i]
    input[403+i+100] <- DF$dye3[d + i]
    input[604+i+100] <- DF$dye4[d + i]
    input[805+i+100] <- DF$dye5[d + i]
    input[1006+i+100] <- DF$dye6[d + i]
  }
}
})

1 Ответ

1 голос
/ 22 марта 2020

Во-первых: пожалуйста, действительно Пересмотрите, чего вы хотите достичь, и является ли этот подход самым разумным способом достижения этого ..

Во-вторых: используйте векторизацию для повышения производительности:

d <- 3000
input <- numeric(1206)

microbenchmark::microbenchmark(
  # loop as before
  case1 = {for (i in -100:100){
    input[1+i+100] <- DF$dye1[d + i]
  }},
  # use vectorization
  case2 = {input[(1-100+100):(1+100+100)] <- DF$dye1[(d -100):(d +100)]}
)
...