使用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 []更好的性能是由於檢查。非常感謝你。 –