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

Is there actually a difference in execution time between multiplying vectors and simply raising the vector to the nth power?

例如,

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

x^4

x * x * x * x

如果是这样,有人可以解释为什么会这样吗?欢迎任何答案,即使只是“去读一下这个或看看另一个 post。”

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

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