R data.table的最佳键类型
整数或更小的字符串作为data.table中的键是否更快?比如说,R data.table的最佳键类型,r,data.table,R,Data.table,整数或更小的字符串作为data.table中的键是否更快?比如说, dt1 = data.table(x = c("a","b","c","d","e"), y= c(1,2,3,4,5)) vs dt1中的x键是否比dt2.x中的长字符串更好/更快?换句话说,字符串长度如何影响速度 谢谢 我比较了data.table对象在三种不同数据操作中具有不同大小键长度的性能。table-operation: 创建一个data.table 设置data.table的键 访问data.table中的行
dt1 = data.table(x = c("a","b","c","d","e"), y= c(1,2,3,4,5))
vs
dt1中的x键是否比dt2.x中的长字符串更好/更快?换句话说,字符串长度如何影响速度
谢谢 我比较了
data.table
对象在三种不同数据操作中具有不同大小键长度的性能。table-operation:
库(data.table)
图书馆(随机)
图书馆(微基准)
size=c(2,5,10,20)#我们将在data.tables中用作键的字符串的长度
#生成不同长度的随机字符串:
为什么不自己做基准呢?这不是讽刺。。。microbenchmark
软件包使基准测试变得非常容易。在大多数问题中,我寻找绊脚石——是什么阻止提问者自己解决问题?在这个问题上,我没有看到绊脚石——这是一个很好的问题(不是我投的反对票——只是投了反对票来制衡),但我不确定你为什么不提供答案。我同意这听起来是一个有趣的问题。如果您有一个基准来显示一些差异,那么从某人那里听到它的“为什么”会更有趣。不需要防守。除了“仅仅帮助”(我把你的意思理解为回答),我们还想了解被问到了什么。通常,我们会看到一个问题问X,但实际上有问题Y,我们只能通过问OP问题而不是立即提供答案来找到答案。
dt2 = data.table(x = c("ndjdnjndjndddjhjdhdhdbdjbjhfbdfbdfjhdbfd", "jnjwnjdndsjdsndjskndskjdnsdjsndskdnsk","jnjnsjncsccdjhcbdhjcbdcjhd","sjdnjdncjdncdcdcdccndcd","wjdndjnjcndcjdncdc"), y= c(1,2,3,4,5))
library(data.table)
library(random)
library(microbenchmark)
sizes = c(2, 5, 10, 20) #Length of the strings we'll use as keys in the data.tables
# Generate random strings of different lengths:
randomstrings <- function(size){
randomStrings(n = 100, len = size, upperalpha = F, digits = F, check = F)
}
keys <- lapply(sizes, randomstrings) # The differently sized keys we'll use
# Create data table:
dt <- function(keys){data.table(x = keys, y = 1:100)}
# Function that chooses 5 keys randomly (used to access lines in the benchmarking):
some5keys <- function(datatable){datatable[sample(datatable$x.V1, 5)]}
### BENCHMARKING ###
# Creating the data.tables:
(creationbench <- microbenchmark(dt1 <- dt(keys[[1]]),
dt2 <- dt(keys[[2]]),
dt3 <- dt(keys[[3]]),
dt4 <- dt(keys[[4]])))
# Unit: microseconds
# expr min lq mean median uq max neval
# dt1 <- dt(keys[[1]]) 562.926 609.1035 714.7314 672.5955 803.7075 1117.683 100
# dt2 <- dt(keys[[2]]) 565.636 605.7725 737.8285 661.0125 756.9390 5087.124 100
# dt3 <- dt(keys[[3]]) 563.347 606.8465 694.8140 631.6945 754.4420 1326.753 100
# dt4 <- dt(keys[[4]]) 578.101 622.4180 722.8112 708.4055 785.9755 1509.439 100
# Setting the keys for the data.tables:
(setkeybench <- (microbenchmark(setkey(dt1, x.V1),
setkey(dt2, x.V1),
setkey(dt3, x.V1),
setkey(dt4, x.V1))))
# Unit: microseconds
# expr min lq mean median uq max neval
# setkey(dt1, x.V1) 76.401 77.9530 82.28644 78.7440 81.3955 111.267 100
# setkey(dt2, x.V1) 75.620 77.7395 91.95130 79.6885 90.6075 343.743 100
# setkey(dt3, x.V1) 76.330 77.7900 84.21696 78.6290 83.8310 189.792 100
# setkey(dt4, x.V1) 76.044 77.8135 85.35959 79.1675 89.8920 129.458 100
# Accessing lines in the data.tables:
(selectbench <- (microbenchmark(some5keys(dt1),
some5keys(dt2),
some5keys(dt3),
some5keys(dt4))))
# Unit: microseconds
# expr min lq mean median uq max neval
# some5keys(dt1) 958.961 1029.778 1244.538 1131.350 1318.147 5389.407 100
# some5keys(dt2) 968.710 1037.023 1246.963 1131.209 1302.656 5890.560 100
# some5keys(dt3) 966.647 1025.569 1206.210 1140.247 1299.570 2221.324 100
# some5keys(dt4) 960.804 1042.528 1218.077 1171.347 1363.010 1813.551 100