我已经尝试过测量这两种取平方根的速度:
> 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)
答案 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
会揭露这个问题。