为什么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()
Run Code Online (Sandbox Code Playgroud)
巴蒂斯特已在评论中将拉德福德尼尔的博客联系起来.
但由于SE人不喜欢与外部网站的链接,让我引用作者本人的有趣评论(评论33):
是的,括号仍然比R 2.13.1和最新的R 2.14.1中的大括号慢,但不像以前那么多(我建议减少内置函数的一般开销的补丁包含在以后的版本中) ,这减少了这种差异).
圆括号没有充分的理由变慢.我建议另一个改变(只需几行代码),这将加快括号.Luke Tierney回答说,这个补丁不应该被整合到R中,因为括号是一个像sqrt一样的运算符,因此在代码中应该没有任何东西可以实现与sqrt之类的运算符的实现有关的括号.
知道这( )看起来像是一个操作员 - 就像一个基本上什么都不做的功能 -
同时{ }也是一个语言结构.
括号( )包含一些所有操作符共有的开销代码,实际上并不需要它们.
Lukas很好地回答了这个问题,但是对于那些感兴趣的人(这可以通过矢量化代码有效地删除),这里有一些时间安排.
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
Run Code Online (Sandbox Code Playgroud)
1e5环长度差异约为5毫秒.所以让我们删除循环:
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
Run Code Online (Sandbox Code Playgroud)
差异现在约为0.5毫秒.