从setkey中获得性能提升

时间:2016-02-16 09:25:06

标签: r performance data.table subset

我已阅读文档 request.user.myprofile 以及有关此主题的一些在线资源,例如this

但我仍然在努力使用data.table vignette("datatable-intro")看到性能提升(尽管我发现它比基础setkey[快得多,即使没有关键字设置也是如此)。

任何想法为什么?我的例子是小/简单看到性能提升吗?或者我做错了什么?

我期待使用密钥的dtk更快。

dplyr::filter

data.table

1 个答案:

答案 0 :(得分:2)

我找到了3个地方需要修复或改进。

  1. if($responseText.status == 'SUC') 运营商不会复制data.table,然后=会在两个data.tables上设置密钥,因此setkey是必需的。
  2. 没有密钥的ad-hoc连接,还不能使用索引,但它是有计划的。
  3. copy将在第一次尝试时构建索引并重新使用它,因此无索引的基准值得添加。
  4. dfdt[l == "a"]

    抱歉library(data.table) library(microbenchmark) op = options("datatable.auto.index" = TRUE) # default! df = data.frame(l = letters, n = 1:26) df = do.call(rbind, replicate(1e4, df, FALSE)) dfdtk = as.data.table(df) dfdt = copy(dfdtk) # fix #1 setkeyv(dfdtk, "l") stopifnot( is.null(key(dfdt)), key(dfdtk) == "l" ) mb = microbenchmark(times = 10, unit = "s", base = df[df$l == "a",], dt = dfdt[l == "a"], dtl = dfdt[list("a"), on = c("l" = "V1")], # fix #2 dtk = dfdtk[list("a")]) print(mb) #Unit: seconds # expr min lq mean median uq max neval # base 0.016255351 0.017294076 0.0177331871 0.0178513590 0.018269365 0.019392296 10 # dt 0.000792324 0.000819030 0.0011565028 0.0009645955 0.001056976 0.002278742 10 # dtl 0.001625836 0.001657269 0.0018865184 0.0019408475 0.002009650 0.002196615 10 # dtk 0.000566798 0.000598538 0.0007664731 0.0007530190 0.000897327 0.001008621 10 options("datatable.auto.index" = FALSE) # fix #3 stopifnot( key2(dfdt) == "l", is.null(key2(set2keyv(dfdt, NULL))) ) mb = microbenchmark(times = 10, unit = "s", base = df[df$l == "a",], dt = dfdt[l == "a"], dtl = dfdt[list("a"), on = c("l" = "V1")], dtk = dfdtk[list("a")]) print(mb) #Unit: seconds # expr min lq mean median uq max neval # base 0.015935139 0.017397039 0.0253407267 0.0180737620 0.019560766 0.090317493 10 # dt 0.014194243 0.014292279 0.0153187365 0.0153102030 0.015997166 0.016689574 10 # dtl 0.001628532 0.001774283 0.0020169391 0.0018818880 0.001935386 0.003697506 10 # dtk 0.000556702 0.000653134 0.0006869461 0.0006898765 0.000764199 0.000780357 10 options(op) s,进行大量单元测试...