为什么** 0.5似乎比sqrt()更有效

时间:2015-03-17 11:41:30

标签: r performance square-root sqrt exponentiation

我已经尝试过测量这两种取平方根的速度:

> system.time(expr = replicate(10000, 1:10000 ** (1/2)))
##   user  system elapsed 
##  0.027   0.001   0.028 
> system.time(expr = replicate(10000, sqrt(1:10000)))
##   user  system elapsed 
##  3.722   0.665   4.494 

如果sqrt()函数无法与** 0.5竞争,为什么我们需要这样的函数?

(系统是OS X Yusemite,R版本是3.1.2)

2 个答案:

答案 0 :(得分:13)

你忘记了重要的括号。以下是纠正后的时间:

system.time(expr = replicate(10000, (1:10000) ** (1/2)))
#user  system elapsed 
#4.76    0.32    5.12 
system.time(expr = replicate(10000, sqrt(1:10000)))
#user  system elapsed 
#2.67    0.57    3.31

答案 1 :(得分:8)

要添加@Roland的回答,你会陷入Operators precedence"陷阱"。在^之前: {" **在解析器中翻译为^ "根据{?"**"的文档1}})

真正发生的是

`:`(1, 10000 ** (1/2))

这意味着您首先运行**,然后才1:..

未来的提示,尝试在运行复杂的操作之前调试代码,例如,测试

1:5 ** (1/2)
## [1] 1 2
sqrt(1:5)
## [1] 1.000000 1.414214 1.732051 2.000000 2.236068 

会揭露这个问题。

相关问题