valores resueltos funcion entre ejemplos definicion condiciones condicional con buscarv anidada r performance function nested nested-function

resueltos - funcion si con dos condiciones



¿Son las funciones anidadas más lentas? (1)

¿Es más lento definir una función secundaria que una función principal dentro del elemento principal (como función anidada)?

Por ejemplo, supongamos que la solución 1:

Foo <- function(x) { Baz <- function(y) { #... do something } #... do something and call Baz, for instance sapply(x, Baz) }

o alternativamente solución 2:

Baz <- function(y) { #... do something } Foo <- function(x) { #... do something and call Baz, for instance sapply(x, Baz) }

En la solución 1 hay un proceso adicional de definición de Baz mientras se ejecuta Foo , así que supongo que muchas llamadas a Foo en la solución 1 serían un poco más lentas. ¿Es verdad?


Es muy difícil predecir la velocidad / eficiencia sin mirar las funciones particulares y los datos de entrada. Lo que acelera un tipo de proceso puede no ser necesariamente bueno para otro. Podrías probar un punto de referencia simple como

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())

Aquí cuando lo ejecuto un montón de veces. Entonces parece muy comparable. Si está tratando de acelerar el código, es poco probable que sea un lugar donde se está desacelerando. Pero es mejor probar los escenarios del "mundo real" para estar seguros.

La importancia de las funciones de anidamiento realmente entra cuando crea cierres. Una función hija puede acceder al entorno de una función principal. Esta puede ser una herramienta muy poderosa.