#r #performance #function #nested #nested-function
#r #Производительность #функция #вложенные #вложенная функция
Вопрос:
Медленнее ли определение дочерней функции, которая будет вызываться родительской функцией внутри родительской (как вложенная функция)?
Например, предположим, что решение 1:
Foo <- function(x) {
Baz <- function(y) {
#... do something
}
#... do something and call Baz, for instance
sapply(x, Baz)
}
или альтернативное решение 2:
Baz <- function(y) {
#... do something
}
Foo <- function(x) {
#... do something and call Baz, for instance
sapply(x, Baz)
}
В решении 1 есть дополнительный процесс определения Baz
во время выполнения Foo
, поэтому я думаю, что многие вызовы Foo
в решении 1 будут немного медленнее. Это правда?
Ответ №1:
Очень сложно предсказать скорость / эффективность, не глядя на конкретные функции и входные данные. То, что ускоряет один тип процесса, не обязательно может быть полезно для другого. Вы могли бы попробовать простой тест, такой как
m1<- function() {
x<-rep(runif(100))
Baz <- function(y) {
mean(y)
}
sapply(x, Baz)
}
Baz <- function(y) {
mean(y)
}
m2 <- function() {
x<-rep(runif(100))
sapply(x, Baz)
}
library(microbenchmark)
microbenchmark(m1(), m2())
Здесь, когда я запускаю его несколько раз. Тогда они кажутся очень сопоставимыми. Если вы пытаетесь ускорить код, вряд ли это то место, где вы замедляетесь. Но лучше протестировать сценарии «реального мира», чтобы быть уверенным.
Важность вложенных функций действительно проявляется при создании замыканий. Дочерняя функция может получить доступ к среде родительской функции. Это может быть очень мощным инструментом.