Можно ли оптимизировать эту функцию plot_normal_distribution?

#r #performance #optimization

#r #Производительность #оптимизация

Вопрос:

Я попытался оптимизировать функцию, которую написал несколько недель назад. Стало лучше, но все еще медленно. Итак, я использовал Rprof() и обнаружил, split() что занимает больше всего времени, что по какой-то причине заставляет меня думать, что эта функция может быть намного лучше.

Можно ли это сделать ?!

 normDist_V2 <- function(size=1e5, precision=1, ...)
{
  data <- rnorm(size) 
  roundedData <- round(data, precision) 
  framedData <- data.frame(cbind(data, roundedData))
  factoredData <- split(framedData$data, framedData$roundedData)
  actualsize <- (size)/10^precision
  X <- names(factoredData)
  Probability <- sapply(factoredData, length) / actualsize
  plot(X, Probability, ...)
}
 

Текущая скорость:

 system.time(normDist_V2(size=1e7, precision = 2)) #11.14 sec
 

Комментарии:

1. Здравствуйте, мистер. Сампати. Не могли бы вы опубликовать образец данных, чтобы мы могли запускать код как можно ближе к вашей среде, пожалуйста?

Ответ №1:

 normDist_V2 <- function(size = 1e5, precision = 1, ...) {
  require(data.table)
  data <- rnorm(size)
  roundedData <- round(data, precision)
  framedData <- data.table(data, roundedData)
  actualsize <- (size)/10^precision
  dt <- framedData[, .N, keyby = roundedData]
  X <- dt$roundedData
  Probability <- dt$N/actualsize
  plot(X, Probability, ...)
}

system.time(normDist_V2(size=1e7, precision = 2)) # 1.26 sec
 

Комментарии:

1. можете ли вы немного подробнее объяснить, что вы сделали и почему это быстрее (т. Е. Использование data.table )?