微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

相乘向量和简单地将向量提高到 n 次方之间的执行时间实际上是否存在差异?

如何解决相乘向量和简单地将向量提高到 n 次方之间的执行时间实际上是否存在差异?

例如

x <- seq.int(1,1000,2)

x^4

x * x * x * x

如果是这样,有人可以解释为什么会这样吗?欢迎任何答案,即使只是“阅读有关此内容或查看其他帖子”。

解决方法

好吧,对这两个解决方案进行基准测试表明乘法比乘方更快。

x <- seq.int(1,10000000,2)


microbenchmark::microbenchmark(raise_to = x^4,multiply = x * x * x * x)

#Unit: milliseconds
#     expr      min        lq      mean    median        uq      max neval cld
# raise_to 92.78304 110.46660 120.83709 121.54933 125.53588 187.5820   100   b
# multiply 12.71391  24.21508  39.05668  26.50335  32.59123 700.3454   100   a 
,

实际上性能取决于x的长度。看来,如果你有较短的 x,那么 x^4 会更快,否则 x * x * x * x 将是赢家。


回到为什么?。我猜^作为幂算符需要处理一般情况,例如x^3.5x^complex(1,3.2,4.5),而*只是将所有项相乘,不需要处理对输入参数的任何预处理。


当你运行下面的代码时

for (ub in seq(10,100,10)) {
  x <- seq.int(1,ub,2)
  cat(sprintf("\nlength of x is %s\n ",length(x)))
  print(microbenchmark::microbenchmark(
    pow = x^4,multiply = x * x * x * x,unit = "relative"
  ))
}

你会看到

length of x is 5
 Unit: relative
     expr min       lq     mean   median      uq       max neval
      pow   1 1.000000 1.000000 1.000000 1.00000 1.0000000   100
 multiply   2 1.995025 1.490337 1.985149 1.66113 0.2044481   100

length of x is 10
 Unit: relative
     expr   min lq     mean   median       uq       max neval
      pow 1.002  1 0.857511 1.164452 1.141839 0.1394461   100
 multiply 1.000  1 1.000000 1.000000 1.000000 1.0000000   100

length of x is 15
 Unit: relative
     expr min       lq    mean   median       uq      max neval
      pow 1.5 1.498753 1.08284 1.334812 1.399202 0.342246   100
 multiply 1.0 1.000000 1.00000 1.000000 1.000000 1.000000   100

length of x is 20
 Unit: relative
     expr min       lq     mean   median       uq       max neval
      pow 1.6 1.794821 1.563364 1.499168 1.665557 0.6875976   100
 multiply 1.0 1.000000 1.000000 1.000000 1.000000 1.0000000   100

length of x is 25
 Unit: relative
     expr min       lq     mean   median       uq       max neval
      pow 2.5 2.197605 1.999897 2.197605 1.998336 0.8122462   100
 multiply 1.0 1.000000 1.000000 1.000000 1.000000 1.0000000   100

length of x is 30
 Unit: relative
     expr      min       lq     mean   median       uq      max neval
      pow 2.987562 2.596806 2.354313 2.329451 2.327243 5.842429   100
 multiply 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000   100

length of x is 35
 Unit: relative
     expr   min      lq     mean   median       uq      max neval
      pow 2.802 2.99004 2.622254 2.663894 2.460829 5.912573   100
 multiply 1.000 1.00000 1.000000 1.000000 1.000000 1.000000   100

length of x is 40
 Unit: relative
     expr min      lq     mean   median       uq       max neval
      pow 3.4 3.39521 2.683118 2.996672 2.574286 0.7391871   100
 multiply 1.0 1.00000 1.000000 1.000000 1.000000 1.0000000   100

length of x is 45
 Unit: relative
     expr   min       lq     mean   median      uq      max neval
      pow 3.604 3.168333 3.088436 3.329451 2.92582 3.568409   100
 multiply 1.000 1.000000 1.000000 1.000000 1.00000 1.000000   100

length of x is 50
 Unit: relative
     expr   min       lq     mean  median       uq      max neval
      pow 4.002 3.501667 3.314933 3.66223 3.277778 6.634094   100
 multiply 1.000 1.000000 1.000000 1.00000 1.000000 1.000000   100

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。