Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么带“{}”的R代码比带“()”的快?_R - Fatal编程技术网

为什么带“{}”的R代码比带“()”的快?

为什么带“{}”的R代码比带“()”的快?,r,R,为什么带有{}的R代码通常比带有()的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() baptiste已经在评论中链接了Radford Neal的博

为什么带有
{}
的R代码通常比带有
()
的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()

baptiste已经在评论中链接了Radford Neal的博客。
但是由于SE用户不喜欢外部站点的链接,让我引用作者本人的一条有趣的评论(评论33):

是的,在R 2.13.1和最新的R 2.14.1中,括号仍然比花括号慢,虽然比以前慢了很多(我建议的用于减少内置函数一般开销的补丁在以后的版本中被引入,从而减少了这种差异)

没有理由让括号变慢。我建议进行另一项更改(只需几行代码),以加快括号的速度。Luke Tierney回应说,无论如何都不应该将此修补程序合并到R中,因为括号是一个与sqrt类似的运算符,因此实现括号的代码中不应该有任何与sqrt等运算符的实现方式不同的内容

知道了这一点,
()
似乎是一个操作符,很像一个基本上什么都不做的函数 而
{}
是一种语言结构。

括号中的
()
包含了所有操作符所共有的一些开销代码,实际上它们并不需要这些代码。

Lukas很好地回答了这个问题,但这里有一些对开销感兴趣的人的时间安排(通过对代码进行矢量化可以有效地消除这些开销)


brace检查一下,我也希望能有一个真实的例子,说明上面识别的差异在哪里(顺便说一句,我无法重现)这将对你处理任务的方式产生明显的影响。Radford Neal的链接博客提供了一些例子和解释。另一个减少毫秒分数的“提示”:使用
**
而不是
^
有趣的是,
'{
'(“
解析为
调用
对象,带有原始函数。区别一定在C代码中。这个答案是不正确的:
{
现在也是R中的运算符,而不是语言构造!和
)一样,它可以重载。这可能是自注释(和此答案)之后发生的更改。)然而,这些都是书面的。
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