乘以向量和简单地将向量提升到 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.5
或 x^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
例如,
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.5
或 x^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