^2和^ 2L有区别吗?
问题描述:
a^2
和a^2L
之间是否有差异R?^2和^ 2L有区别吗?
速度差?
精度?
到目前为止,我看不到任何人,只是想知道^ 2是作为log/exp对实现的,而^ 2L作为乘法。那么如果a
不只是一个向量?
UPDATE
不,这不是重复的,我知道2
和2L
之间的差异。问题是,这种差异是否对电力运营商起作用?
答
R在内部使用整数指数版本R_pow_di
,但^
operator仅调用R_pow
。也就是说,R_pow
确实特例x^2
作为。因此,精度是相同的,但2L
版本应该稍慢,因为在C级长时间>双倍强制。这在下面的基准中得到了证明。
lngs<-rep(2L,1e6)
dbls<-rep(2.0,1e6)
n<-sample(100,1e6,replace=TRUE)
x<-rnorm(1e6)
microbenchmark(x^lngs,x^dbls,n^lngs,n^dbls)
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# x^lngs 8.489547 9.804030 12.543227 11.719721 13.98702 19.92170 100 b
# x^dbls 5.622067 6.724312 9.432223 7.949713 10.89252 59.15342 100 a
# n^lngs 10.590587 13.857297 14.920559 14.200080 16.65519 19.55346 100 c
# n^dbls 8.331087 9.699143 12.414267 11.403211 14.20562 19.66389 100 b
这没什么可以让我们失眠。
链接转到源镜像。请注意,R_ADD
,R_SUB
,R_MUL
和R_DIV
被定义为利用类型过载的C宏,但R_POW
被定义为内嵌x^2 = x*x
特殊情况,然后调用R_pow
(小写)。在R_pow
中再次检查该特殊情况将是重复的,但R_pow
在内部被称为其他地方。
答
我的结论是,这是有史以来所以,稍微快当且仅当基本是一个整数,以及,标量。
我的风向标:
library(microbenchmark)
set.seed(1230)
num <- rnorm(1L)
int <- sample(100L, 1L)
microbenchmark(times = 100000L,
num^2L,
num^2,
int^2L,
int^2)
而且我的机器上的时序:
# Unit: nanoseconds
# expr min lq mean median uq max neval
# num^2L 99 115 161.8495 121 166 11047 1e+05
# num^2 97 113 196.8615 119 165 3645369 1e+05
# int^2L 89 107 140.3745 111 120 3319 1e+05
# int^2 98 115 525.1727 120 166 34776551 1e+05
如果基或指数是一个数字的中位时间基本上是相同的(虽然也许num^num
有脂肪高尾?)。
尺寸
的刑罚尽管integer^integer
标量,它出现的优势(在他自己的答案阐明通过@ A.Webb),对于任何合理大小的矢量,numeric^numeric
速度更快,而且,对于相当常见的中等尺寸范围的矢量,速度要快得多。从500点的基准
结果:
set.seed(1230)
ns <- as.integer(10^(seq(0, 6, length.out = 500L)))
mbs <- sapply(ns, function(n){
num = rnorm(n); int = as.integer(num)
summary(microbenchmark(times = 2000L, num^2L, num^2, int^2L, int^2),
unit = "relative")$median
})
这第一条曲线得到的东西的要点。 n
表示numeric
和i
表示integer
。
最后,向量的大小的固定成本并吞噬的优点:
只有在可忽略的长度是i^i
最快:
绘图的要点是:
matplot(ns[ns < 5000], t(mbs[ , ns < 5000]),
type = "l", lty = 1L, lwd = 3L,
xlab = "length", ylab = "Relative Time",
main = "Through Length 5000",
col = c("black", "red", "green", "blue"))
legend("topleft", c("n^i", "n^n", "i^i", "i^n"),
col = c("black", "red", "green", "blue"),
lty = 1L, lwd = 3L)
关于是否有差异,你可以自己做基准... – akrun
也许吧。 [mlutils.c](https://github.com/wch/r-source/blob/b156e3a711967f58131e23c1b1dc1ea90e2f0c43/src/nmath/mlutils.c)有'R_pow'和'R_pow_di',但我没有检查更远的上游以查看解析器是否使用了'R_pow_di'。 –
关于速度的FWIW,使用'2'的速度比使用'2L'的速度略快,但差别是可以忽略不计(我的机器上的平均差10毫秒,长度为1e7的矢量) – Heroka