Протестирован эталонный тест, фильтрующий фрейм данных из 2 миллионов строк на 200 000 строк, как указано в исходном сообщении, где вы можете четко увидеть скорость data.table
относительно dplyr
. Учитывая огромное время, которое потребовалось dplyr
функциям, особенно set_diff
, я запускал каждую из них только один раз.
rbenchmark::benchmark(
"dplyr_anti_join" = {
set.seed(1)
df <- data.frame(a = letters[runif(10000000, min = 1, max = 26)],
b = runif(100000000, 1, 200000))
indices <- data.frame(a = letters[runif(200000, min = 1, max = 26)],
b = 1:200000)
dplyr::anti_join(df, indices, by = c("a", "b"))
},
"dplyr_set_diff" = {
set.seed(1)
df <- data.frame(a = letters[runif(10000000, min = 1, max = 26)],
b = runif(100000000, 1, 200000))
indices <- data.frame(a = letters[runif(200000, min = 1, max = 26)],
b = 1:200000)
dplyr::setdiff(df, indices)
},
"dt" = {
set.seed(1)
library(data.table)
df <- data.table(a = letters[runif(10000000, min = 1, max = 26)],
b = runif(100000000, 1, 200000))
indices <- data.table(a = letters[runif(200000, min = 1, max = 26)],
b = 1:200000)
fsetdiff(df, indices)
},
replications = 1
)
#> test replications elapsed relative user.self sys.self user.child sys.child
#> 1 dplyr_anti_join 1 637.06 13.165 596.86 11.50 NA NA
#> 2 dplyr_set_diff 1 9981.93 206.281 320.67 4.66 NA NA
#> 3 dt 1 48.39 1.000 80.61 8.73 NA NA