我希望从矩阵(或向量)中尽快读取值。
标准方法如下:
# defining the matrix
x = matrix(runif(100), nrow=10)
# reading one value
x[2,3]
我尝试将data.table与索引一起使用,但是看起来慢很多:
x2 = as.data.table(x)
x2$idx = 1:10
setkey(x2, idx)
x2
x[2,3]
x2[2,3, with=F]
# we verify it is the same value
microbenchmark(x[2,3], x2[2,3, with=F])
Unit: nanoseconds
expr min lq mean median uq max neval
x[2, 3] 132 157 479.9 504 677 2811 100
x2[2, 3, with = F] 181007 185055 200142.2 188007 197573 441153 100
有什么方法可以比读取基本矩阵更快?
答案 0 :(得分:0)
否,没有比matr[i, j]
更快的方法来读取矩阵了。
dt[['V3']][2]
。 dt[2,3]
太慢了。df[['V3']][2]
。 您的示例在10行(即1,000,000列)中具有10,000,000个值
Unit: nanoseconds
expr min lq mean median uq max neval
vect[22] 100 900 1380 1250 2000 2900 10
x[2, 3] 100 200 1130 1500 1700 2300 10
x[[22]] 600 1000 1620 1600 1700 4400 10
dt[2, 3] 1120103100 1121659900 1132672490 1121957850 1123820200 1226030600 10
dt[2, V3] 1183598600 1185074800 1204766740 1188306650 1220468900 1262510200 10
dt[["V3"]][2] 8900 16800 32950 39850 43200 44400 10
df[2, 3] 7851400 7867500 8753220 8730250 9547200 10022700 10
df[["V3"]][2] 8100 11500 20830 16150 32700 36000 10
您的示例具有10,000,000行和10列:
Unit: nanoseconds
expr min lq mean median uq max neval
vect[22] 100 300 508 400 600 2000 100
x[2, 3] 200 300 591 500 800 2600 100
x[[22]] 200 500 727 600 900 1900 100
dt[2, 3] 280800 288700 314736 295350 325200 509700 100
dt[2, V3] 495700 505950 910938 522750 560700 37038500 100
dt[["V3"]][2] 8200 9200 12048 11350 13100 23200 100
df[2, 3] 20600 23100 29587 28700 32950 68100 100
df[["V3"]][2] 7400 8300 11310 10500 12550 24100 100
您的100行示例:
Unit: nanoseconds
expr min lq mean median uq max neval
vect[22] 0 300 416 300 500 1100 100
x[2, 3] 100 300 542 450 800 1500 100
x[[22]] 100 400 654 600 800 1400 100
dt[2, 3] 256200 262000 270385 264850 268950 410100 100
dt[2, V3] 432000 439750 457196 443900 462200 617900 100
dt[["V3"]][2] 7800 8700 10965 10350 11400 23500 100
df[2, 3] 16600 18450 23580 22600 27300 81800 100
df[["V3"]][2] 7100 7850 9781 9400 10300 15100 100
编辑:数据:
library(data.table)
set.seed(1)
vect <- runif(1E7)
x <- matrix(vect, ncol = 10)
df <- as.data.frame(x)
dt <- as.data.table(x)
vect[22];x[2,3];x[[22]];dt[2, 3]; df[2, 3]