Да, группировка распараллелена в v 1.12.0
Ваш эталонный тест - немного красной сельди.Вы хотите fast f(x, y)
, если вы хотите изолировать скорость группировки.Используя количество элементов в ваших примерах, но с помощью тривиальной функции мы получим:
library(data.table)
packageVersion("data.table")
#> [1] '1.12.0'
n = 5e6
N <- n
k = 1e4
print(getDTthreads())
#> [1] 12
DT = data.table(x = rep_len(runif(n), N),
y = rep_len(runif(n), N),
grp = rep_len(sample(1:k, n, TRUE), N))
bench::system_time(DT[, .(a = 1L), by = "grp"])
#> process real
#> 250.000ms 72.029ms
setDTthreads(1)
bench::system_time(DT[, .(a = 1L), by = "grp"])
#> process real
#> 125.000ms 126.385ms
Создано в 2019-02-01 пакетом представлением (v0.2.1)
То есть мы были немного быстрее в параллельном случае, но только примерно на 50 мс - ничтожно мало по сравнению с 3 с вашей функции.
Если мы увеличим размерDT, мы можем увидеть более существенную разницу:
library(data.table)
packageVersion("data.table")
#> [1] '1.12.0'
n = 5e6
N <- 1e9
k = 1e4
print(getDTthreads())
#> [1] 12
DT = data.table(x = rep_len(runif(n), N),
y = rep_len(runif(n), N),
grp = rep_len(sample(1:k, n, TRUE), N))
bench::system_time(DT[, .(a = 1L), by = "grp"])
#> process real
#> 45.719s 14.485s
setDTthreads(1)
bench::system_time(DT[, .(a = 1L), by = "grp"])
#> process real
#> 24.859s 24.890s
sessioninfo::session_info()
#> - Session info ----------------------------------------------------------
#> setting value
#> version R version 3.5.2 (2018-12-20)
#> os Windows 10 x64
#> system x86_64, mingw32
#> ui RTerm
#> language (EN)
#> collate English_Australia.1252
#> ctype English_Australia.1252
#> tz Australia/Sydney
#> date 2019-02-01
#>
Создано в 2019-02-01 с помощью пакета Представить (v0.2.1)