2016-02-11 174 views
0

a^2a^2L之间是否有差异R^2和^ 2L有区别吗?

速度差?

精度?

到目前为止,我看不到任何人,只是想知道^ 2是作为log/exp对实现的,而^ 2L作为乘法。那么如果a不只是一个向量?

UPDATE

不,这不是重复的,我知道22L之间的差异。问题是,这种差异是否对电力运营商起作用?

+6

关于是否有差异,你可以自己做基准... – akrun

+0

也许吧。 [mlutils.c](https://github.com/wch/r-source/blob/b156e3a711967f58131e23c1b1dc1ea90e2f0c43/src/nmath/mlutils.c)有'R_pow'和'R_pow_di',但我没有检查更远的上游以查看解析器是否使用了'R_pow_di'。 –

+0

关于速度的FWIW,使用'2'的速度比使用'2L'的速度略快,但差别是可以忽略不计(我的机器上的平均差10毫秒,长度为1e7的矢量) – Heroka

回答

4

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_MULR_DIV被定义为利用类型过载的C宏,但R_POW被定义为内嵌x^2 = x*x特殊情况,然后调用R_pow(小写)。在R_pow中再次检查该特殊情况将是重复的,但R_pow在内部被称为其他地方。

5

我的结论是,这是有史以来所以,稍微快当且仅当基本是一个整数,以及,标量

我的风向标:

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

5k

这第一条曲线得到的东西的要点。 n表示numerici表示integer

最后,向量的大小的固定成本并吞噬的优点:

1e6

只有在可忽略的长度是i^i最快:

50


绘图的要点是:

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) 
相关问题