使用R中的向量时,diff
函数会计算每个值与前一个值之间的差异。从?diff
:R diff函数为什么很慢?
如果
x
是长度n
和differences = 1
的向量,然后计算结果等于所述连续差x[(1+lag):n] - x[1:(n-lag)]
然而,当我测试的执行时间diff
函数的VS其理论表达式(使用microbenchmark
函数的microbenchmark
包),diff
函数较慢。这里是我的代码:
library(microbenchmark)
mb.diff1 <- function(n, seed){
set.seed(seed)
vec <- runif(n)
out <- diff(vec)
return(out)
}
mb.diff2 <- function(n, seed){
set.seed(seed)
vec <- runif(n)
out <- vec[2:n]-vec[1:(n-1)]
return(out)
}
times.diff1 <- c()
times.diff2 <- c()
vec.sizes <- c(1e1, 1e2, 1e3, 1e4)
for (n in vec.sizes){
bench <- microbenchmark(
mb.diff1(n,1),
mb.diff2(n,1))
times.median <- aggregate(
bench$time,
by = list(bench$expr),
FUN = median)
times.diff1 <- c(times.diff1, times.median[1,2])
times.diff2 <- c(times.diff2, times.median[2,2])
}
perf.ratio <- times.diff1/times.diff2
names(perf.ratio) <- vec.sizes
print(perf.ratio)
我完成了1E4的vec.sizes,所以excution时间为你们并不需要太长时间,但我让他们去,直到1E7。你可以看到结果这里:
正如你所看到的,diff
功能是所有矢量大小慢。商数趋于减少,因为在两种情况下,执行时间似乎都是向量大小的线性函数,所以我们不能说随着n的增加diff
表现更好。因此,这里提出的问题:
- (显而易见的问题)我在测量执行时间时在代码中做错了什么?
diff
函数的原因是什么可能比他们的理论表达式慢?- 你知道计算差异向量的最有效方法吗?比
x[(1+lag):n] - x[1:(n-lag)]
?
我在Linux中使用R 3.1.2。
非常感谢您提前。
R-3.1.2是2岁以上。你的时间安排包括产生一个随机向量,所以你并不是孤立你所要求的差异。使用只调用'diff'和'vec []'的简化函数,在我运行R-3.3.2的Ubuntu 14.04机器上,'diff'更快。 'diff'也是通用的,所以方法调度有一定的成本。直接调用'diff.default'(通常不推荐)速度更快。 –
另外'diff.default'将其输入转换为矩阵并进行一些检查。 https://github.com/wch/r-source/blob/trunk/src/library/base/R/diff.R –
感谢@JoshuaUlrich,我将Ubuntu更新至16.04并安装了R 3.3.2。我还调用runif函数以外的函数,以便可以衡量diff函数的实际执行时间。对于所有这些,Whit比1e4更好。我认为小尺寸的vec []更好的性能是由于检查。非常感谢你。 –