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

Lyt*_*tze 1 performance r exponentiation sqrt square-root

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

> 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 
Run Code Online (Sandbox Code Playgroud)

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

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

Rol*_*and 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
Run Code Online (Sandbox Code Playgroud)


Dav*_*urg 8

为了增加@Roland的答案,你陷入了运算符优先级 "陷阱".^之前:(" **在解析器中翻译为^ "根据文档?"**")

真正发生的是

`:`(1, 10000 ** (1/2))
Run Code Online (Sandbox Code Playgroud)

这意味着,首先你要跑**,然后才开始1:..

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

1:5 ** (1/2)
## [1] 1 2
sqrt(1:5)
## [1] 1.000000 1.414214 1.732051 2.000000 2.236068 
Run Code Online (Sandbox Code Playgroud)

会揭示这个问题.

  • **是指示其他语言中的取幂的一种常见方式.这可能就是他们想出来的原因. (2认同)