定义一个子函数被父函数内部的父函数调用(作为嵌套函数)更慢?
例如假设解决方案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
的过程,因此我猜在解决方案1中对Foo
的许多调用会稍慢。这是真的吗?
答案 0 :(得分:5)
如果不查看特定功能和输入数据,很难预测速度/效率。什么加速一种类型的过程可能不一定对另一种过程有利。您可以尝试像
这样的简单基准测试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())
这时我跑了很多次。然后看起来非常可比。如果您正在尝试加速代码,那么这不太可能是您放慢速度的地方。但是,测试现实世界&#34;会更好。场景只是为了确定。
创建闭包时,嵌套函数的重要性确实存在。子功能可以访问父功能的环境。这可以是一个非常强大的工具。