R:通过XTS对象与矩阵进行子选择:为什么会出现这样的性能下降?
在一个大小相等的XTS对象和一个R矩阵上的for循环中进行子选择,可以产生非常不同的性能。在我的机器上的以下示例中,矩阵代码需要0.42秒,而XTS代码需要31.64秒。假设我必须这样做一个循环,我应该使用as.matrix previor预转换所有XTS对象,还是有办法从XTS对象获得更高的性能R:通过XTS对象与矩阵进行子选择:为什么会出现这样的性能下降?,r,performance,xts,R,Performance,Xts,在一个大小相等的XTS对象和一个R矩阵上的for循环中进行子选择,可以产生非常不同的性能。在我的机器上的以下示例中,矩阵代码需要0.42秒,而XTS代码需要31.64秒。假设我必须这样做一个循环,我应该使用as.matrix previor预转换所有XTS对象,还是有办法从XTS对象获得更高的性能 library(xts) NumRows <- 1000000 NumCols <- 30 theMatrix <- matrix(rep(1,NumRows*NumCols),n
library(xts)
NumRows <- 1000000
NumCols <- 30
theMatrix <- matrix(rep(1,NumRows*NumCols),nrow=NumRows)
theXTS <- xts(theMatrix,Sys.Date()+1:NumRows)
system.time({
for(k in 1:NumRows){
DataPoint <- theMatrix[k,1]
}
})
system.time({
for(k in 1:NumRows){
DataPoint <- theXTS[k,1]
}
})
库(xts)
NumRows是。简单的回答是,当您将xts对象子集时,您将从向量中提取相关时间,并从矩阵中提取相关行,这比仅从矩阵中提取组件的计算时间更昂贵。您通常希望以xts格式保存数据,以便通过times轻松地对数据进行子集设置,但您可以先调用coredata
(这比as.matrix
快),后者在通过整数索引对xts
对象进行子集设置之前公开数据矩阵
读取核心数据
> class(coredata(theXTS))
[1] "matrix"
# Compare benchmark below against subsetting with an existing matrix
theXTS_matrix <- as.matrix(theXTS)
library(microbenchmark)
microbenchmark(theXTS_matrix[5, 7:10], coredata(theXTS),
coredata(theXTS)[5, 7:10],
theXTS[5, 7:10], as.matrix(theXTS)[5, 7:10])
# Unit: nanoseconds
# expr min lq mean median uq max neval
# theXTS_matrix[5, 7:10] 663 1087.5 1479.39 1254.0 1569.0 9062 100
# coredata(theXTS) 10456 12090.5 13413.92 13122.0 14269.0 24106 100
# coredata(theXTS)[5, 7:10] 11703 12959.5 15193.21 14298.5 15499.5 56137 100
# theXTS[5, 7:10] 27519 30293.5 32669.63 31805.5 33130.5 57130 100
# as.matrix(theXTS)[5, 7:10] 200927 205187.5 209949.47 206926.0 212582.0 330426 100
类(coredata(theXTS))
[1] “矩阵”
#将下面的基准与现有矩阵的子集进行比较
XTS_矩阵提供了几个优点,但它们不能解释这两个函数之间差异的大小。我还要注意,在这个问题中没有进行“搜索”:I
和j
已经是整数了,所以它只是一个直接的索引操作
速度上的大部分差异可以归因于在[.xts
中执行的所有检查。即使没有这些检查,您也应该期望[.xts
比矩阵上的[
稍微慢一些,因为xts对象总是需要执行额外的操作:对索引进行子集设置
R> system.time(for(k in 1:10000) theMatrix[k, 1:10])
user system elapsed
0.012 0.000 0.015
R> system.time(for(k in 1:10000)
+ .Call('_do_subset_xts', theXTS, k, 1:10, F, PACKAGE='xts'))
user system elapsed
0.016 0.000 0.018