【问题标题】:Why does **0.5 appear to be more efficient than sqrt() [closed]为什么 **0.5 似乎比 sqrt() 更有效 [关闭]
【发布时间】:2015-03-17 11:41:29
【问题描述】:

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

> 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)

【问题讨论】:

  • 请参阅?Syntax 了解运算符优先级。求幂^ 的优先级高于序列运算符:。比较1:4 ^ (0.5)1:(4 ^ (0.5)); (1:4) ^ (0.5)
  • 在对两个备选方案进行基准测试之前,您应该始终检查它们是否给出相同的结果。

标签: r performance square-root sqrt exponentiation


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    为了补充@Roland 的答案,您陷入了Operators precedence“陷阱”。 ^ 出现在 : 之前(根据?"**" 的文档,“** 在解析器中被翻译成 ^”)

    真正发生的是

    `:`(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 
    

    会揭示问题。

    【讨论】:

    • ** 是一种在其他语言中表示求幂的常用方法。他们大概就是这样想出来的。
    猜你喜欢
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多