为什么使用{}
的R代码通常比使用()
的代码更快,例如下面的示例?
n=10000000
w1=numeric(n)
w2=numeric(n)
r=rnorm(n)
t1=Sys.time()
for(i in 1:n)
w1[i]=((r[i]^2))*(1*1)
t1-Sys.time()
t1=Sys.time()
for(i in 1:n)
w2[i]={{r[i]^2}}*{1*1}
t1-Sys.time()
为什么使用{}
的R代码通常比使用()
的代码更快,例如下面的示例?
n=10000000
w1=numeric(n)
w2=numeric(n)
r=rnorm(n)
t1=Sys.time()
for(i in 1:n)
w1[i]=((r[i]^2))*(1*1)
t1-Sys.time()
t1=Sys.time()
for(i in 1:n)
w2[i]={{r[i]^2}}*{1*1}
t1-Sys.time()
( )
似乎是一个操作符——就像一个基本无作用的函数,
而{ }
是一种语言结构。
括号( )
包含一些所有操作符都共有的额外代码开销,实际上对它们毫无意义。{
现在也是R中的一个运算符,而不是语言结构!就像(
一样,它也可以被重载。然而,自评论(和这个答案)被写出以来,这可能已经发生了改变。 - Konrad RudolphLukas回答了问题,但对于那些感兴趣的人,这里有一些关于开销的时间(通过向量化您的代码可以有效地消除)。
brace <- function(n){
w1=numeric(n)
w2=numeric(n)
r=rnorm(n)
for(i in 1:n)
w1[i]=((r[i]^2))*(1*1)
}
curly <- function(n){
w1=numeric(n)
w2=numeric(n)
r=rnorm(n)
for(i in 1:n)
w2[i]={{r[i]^2}}*{1*1}
}
microbenchmark( curly(1e5) , brace(1e5) , times = 50 )
Unit: milliseconds
expr min lq median uq max neval
curly(1e+05) 311.4245 318.8916 324.1990 335.0928 400.8555 50
brace(1e+05) 315.5428 323.8860 328.7982 350.7268 406.5785 50
braceV <- function(n){
w1=numeric(n)
w2=numeric(n)
r=rnorm(n)
w1=((r^2))*(1*1)
}
curlyV <- function(n){
w1=numeric(n)
w2=numeric(n)
r=rnorm(n)
w2={{r^2}}*{1*1}
}
microbenchmark( curlyV(1e5) , braceV(1e5) , times = 50 )
Unit: milliseconds
expr min lq median uq max neval
curlyV(1e+05) 9.014361 9.284532 9.666867 10.81317 37.82510 50
braceV(1e+05) 9.029408 9.373773 10.293302 10.83487 37.76596 50
**
代替^
。 - Rcoster'{'
和'('
都被解析为具有原始函数的call
对象。区别必须在C代码中。 - Ferdinand.kraft