gpt4 book ai didi

r - 基准 data.frame (base), data.frame(package dataframe) 和 data.table

转载 作者:行者123 更新时间:2023-12-04 18:20:51 27 4
gpt4 key购买 nike

随着最近推出的包dataframe ,我认为是时候正确地对各种数据结构进行基准测试,并突出每种数据结构的优势。我不是每个人的不同优势的专家,所以我的问题是,我们应该如何对它们进行基准测试。

我尝试过的一些(相当粗糙的)事情:

library(microbenchmark)
library(data.table)
mat <- matrix(rnorm(10000), nrow = 100)
mat2df.base <- data.frame(mat)
library(dataframe)
mat2df.dataframe <- data.frame(mat)
mat2dt <- data.table(mat)
bm <- microbenchmark(t(mat), t(mat2df.base), t(mat2df.dataframe), t(mat2dt), times = 1000)

结果:
Unit: microseconds
expr min lq median uq max
1 t(mat) 20.927 23.210 31.201 36.908 951.591
2 t(mat2df.base) 929.903 974.039 997.439 1040.814 28270.717
3 t(mat2df.dataframe) 924.957 969.093 992.683 1025.404 27255.205
4 t(mat2dt) 1749.465 1817.382 1857.903 1909.649 5347.321

最佳答案

我不是 data.table 专家,但据我了解,它的主要优势在于索引。因此,请尝试使用各种包进行子集化以比较速度。

library(microbenchmark)
library(data.table)
mat <- matrix(rnorm(1e7), ncol = 10)
key <- as.character(sample(1:10,1e6,replace=TRUE))
mat2df.base <- data.frame(mat)
mat2df.base$key <- key

bm.before <- microbenchmark(
mat2df.base[mat2df.base$key==2,]
)

library(dataframe)
mat2df.dataframe <- data.frame(mat)
mat2df.dataframe$key <- key
mat2dt <- data.table(mat)
mat2dt$key <- key
setkey(mat2dt,key)


bm.subset <- microbenchmark(
mat2df.base[mat2df.base$key==2,],
mat2df.dataframe[mat2df.dataframe$key==2,],
mat2dt["2",]
)

expr min lq median

uq max
1 mat2df.base[mat2df.base$key == 2, ] 153.99596 154.98602 155.91621 157.0894 194.24456
2 mat2df.dataframe[mat2df.dataframe$key == 2, ] 153.63907 154.66295 155.68553 156.9827 173.76913
3 mat2dt["2", ] 15.51085 15.66742 15.72899 15.8463 22.53044

如果矩阵足够大, data.table 会使用其他选项删除表格。

另外,我怀疑@RJ- 将基本 data.frame 的性能与包 dataframe 的 data.frames 的性能进行比较的尝试不起作用。性能太相似了,我怀疑结果是加载的库而不是基础库的结果。

编辑: 已测试。似乎没有太大区别。 bm.after 与上面的 bm.subset 代码相同,只需与 bm.before 同时运行即可提供准确的比较。
bm.before <- microbenchmark( 
mat2df.base[mat2df.base$key==2,]
)

> bm.after
Unit: milliseconds
expr min lq median uq max
1 mat2df.base[mat2df.base$key == 2, ] 160.62708 166.25787 167.52325 169.18710 173.47864
2 mat2df.dataframe[mat2df.dataframe$key == 2, ] 163.30259 166.00588 167.80138 169.24647 174.05713
3 mat2dt["2", ] 16.16117 16.89627 17.09047 17.37057 62.01954

> bm.before
Unit: milliseconds
expr min lq median uq max
1 mat2df.base[mat2df.base$key == 2, ] 159.178 160.9867 162.1149 164.0046 195.9501

关于r - 基准 data.frame (base), data.frame(package dataframe) 和 data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10721615/

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