gpt4 book ai didi

performance - 从data.table和data.frame对象获取单个元素的时间

转载 作者:行者123 更新时间:2023-12-03 14:20:40 25 4
gpt4 key购买 nike

在我的工作中,我经常使用几个表(客户详细信息,交易记录等)。由于其中一些非常大(数百万行),因此我最近切换到了data.table包(感谢Matthew)。但是,其中一些很小(几百行和4/5列),并且被调用了几次。因此,我开始考虑在获取数据时使用[.data.table开销,而不是像?set中已经明确描述的那样设置set()ting值,在这里,无论表的大小设置在2微秒左右(取决于cpu)。

但是,它似乎不存在与set等效的功能,用于从data.table获取确切的行和列的值。一种可循环的[.data.table

library(data.table)
library(microbenchmark)

m = matrix(1,nrow=100000,ncol=100)
DF = as.data.frame(m)
DT = as.data.table(m) # same data used in ?set

> microbenchmark(DF[3450,1] , DT[3450, V1], times=1000) # much more overhead in DT

Unit: microseconds
expr min lq median uq max neval
DF[3450, 1] 32.745 36.166 40.5645 43.497 193.533 1000
DT[3450, V1] 788.791 803.453 813.2270 832.287 5826.982 1000

> microbenchmark(DF$V1[3450], DT[3450, 1, with=F], times=1000) # using atomic vector and
# removing part of DT overhead
Unit: microseconds
expr min lq median uq max neval
DF$V1[3450] 2.933 3.910 5.865 6.354 36.166 1000
DT[3450, 1, with = F] 297.629 303.494 305.938 309.359 1878.632 1000

> microbenchmark(DF$V1[3450], DT$V1[3450], times=1000) # using only atomic vectors
Unit: microseconds
expr min lq median uq max neval
DF$V1[3450] 2.933 2.933 3.421 3.422 40.565 1000 # DF seems still a bit faster (23%)
DT$V1[3450] 3.910 3.911 4.399 4.399 16.128 1000


最后一种方法确实是快速多次检索单个元素的最佳方法。但是, set甚至更快

> microbenchmark(set(DT,1L,1L,5L), times=1000)
Unit: microseconds
expr min lq median uq max neval
set(DT, 1L, 1L, 5L) 1.955 1.956 2.444 2.444 24.926 1000


问题是:如果我们不能在2.444微秒内 set一个值,那么是否应该不可能在更短(或至少相似)的时间内获得一个值?谢谢。

编辑:
根据建议添加另外两个选项:

> microbenchmark(`[.data.frame`(DT,3450,1), DT[["V1"]][3450], times=1000)
Unit: microseconds
expr min lq median uq max neval
`[.data.frame`(DT, 3450, 1) 46.428 47.895 48.383 48.872 2165.509 1000
DT[["V1"]][3450] 20.038 21.504 23.459 24.437 116.316 1000


不幸的是,这并没有比以前的尝试快。

最佳答案

感谢@hadley,我们有了解决方案!

> microbenchmark(DT$V1[3450], set(DT,1L,1L,5L), .subset2(DT, "V1")[3450], times=1000, unit="us")
Unit: microseconds
expr min lq median uq max neval
DT$V1[3450] 2.566 3.208 3.208 3.528 27.582 1000
set(DT, 1L, 1L, 5L) 1.604 1.925 1.925 2.246 15.074 1000
.subset2(DT, "V1")[3450] 0.000 0.321 0.322 0.642 8.339 1000

关于performance - 从data.table和data.frame对象获取单个元素的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16882049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com