рдореБрдЭреЗ рдпрд╣ data.table рд╕рд╛рдорд╛рди рдкрд╕рдВрдж рд╣реИ, рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рдирд┐рд╖реНрдкрд╛рджрди рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдХреЗ рдЕрдкрдиреЗ рдкрд╛рд░рд┐рд╢реНрд░рдорд┐рдХ рддрд░реАрдХреЗ рдХреЗ рд▓рд┐рдПред
рдореИрдВ рдЗрд╕реЗ рдЫреЛрдЯреА рдЯреЗрдмрд▓ рдкрд░ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реВрдВред
рдореИрдВ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╕рдмрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ: DT[, .(id1, id5)]
рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ: DT[, c("id1", "id5")]
рдЖрдЬ рдореИрдВрдиреЗ рджреЛрдиреЛрдВ рдХреА рдЧрддрд┐ рдорд╛рдкреА рдФрд░ рдЫреЛрдЯреА рдореЗрдЬреЛрдВ рдкрд░ рдЧрддрд┐ рдХреЗ рдЕрдВрддрд░ рд╕реЗ рдЪрдХрд┐рдд рд╣реЛ рдЧрдпрд╛ред рдкрд╛рд░рд╕реАрдореЛрдирд┐рдпрд╕ рддрд░реАрдХрд╛ рд░рд╛рд╕реНрддрд╛ рдзреАрдорд╛ рд╣реИред
рдХреНрдпрд╛ рдпрд╣ рдЕрдВрддрд░ рдХреБрдЫ рдЗрд░рд╛рджрд╛ рд╣реИ?
рдХреНрдпрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╕рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд░ рддрд░реАрдХрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрдХрд╛рдВрдХреНрд╖рд╛ рд╣реИ?
(рдпрд╣ рддрдм рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдЬрдм рдореБрдЭреЗ рдХрдИ рдЫреЛрдЯреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЗ рд╕реЗ рд╕рдмрд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред)
рдЙрдмрдВрдЯреВ 18.04
рдЖрд░ рд╕рдВрд╕реНрдХрд░рдг 3.5.3 (2019-03-11)
рдбреЗрдЯрд╛.рдЯреЗрдмрд▓ 1.12.0
рд░реИрдо 32GB
Intel┬о CoreтДв i7-8565U CPU @ 1.80GHz ├Ч 8
library(data.table)
library(microbenchmark)
N <- 2e8
K <- 100
set.seed(1)
DT <- data.table(
id1 = sample(sprintf("id%03d", 1:K), N, TRUE), # large groups (char)
id2 = sample(sprintf("id%03d", 1:K), N, TRUE), # large groups (char)
id3 = sample(sprintf("id%010d", 1:(N/K)), N, TRUE), # small groups (char)
id4 = sample(K, N, TRUE), # large groups (int)
id5 = sample(K, N, TRUE), # large groups (int)
id6 = sample(N/K, N, TRUE), # small groups (int)
v1 = sample(5, N, TRUE), # int in range [1,5]
v2 = sample(5, N, TRUE), # int in range [1,5]
v3 = sample(round(runif(100, max = 100), 4), N, TRUE) # numeric e.g. 23.5749
)
microbenchmark(
DT[, .(id1, id5)],
DT[, c("id1", "id5")]
)
Unit: seconds
expr min lq mean median uq max neval
DT[, .(id1, id5)] 1.588367 1.614645 1.929348 1.626847 1.659698 12.33872 100
DT[, c("id1", "id5")] 1.592154 1.613800 1.937548 1.628082 2.184456 11.74581 100
N <- 2e5
DT2 <- data.table(
id1 = sample(sprintf("id%03d", 1:K), N, TRUE), # large groups (char)
id2 = sample(sprintf("id%03d", 1:K), N, TRUE), # large groups (char)
id3 = sample(sprintf("id%010d", 1:(N/K)), N, TRUE), # small groups (char)
id4 = sample(K, N, TRUE), # large groups (int)
id5 = sample(K, N, TRUE), # large groups (int)
id6 = sample(N/K, N, TRUE), # small groups (int)
v1 = sample(5, N, TRUE), # int in range [1,5]
v2 = sample(5, N, TRUE), # int in range [1,5]
v3 = sample(round(runif(100, max = 100), 4), N, TRUE) # numeric e.g. 23.5749
)
microbenchmark(
DT2[, .(id1, id5)],
DT2[, c("id1", "id5")]
)
Unit: microseconds
expr min lq mean median uq max neval
DT2[, .(id1, id5)] 1405.042 1461.561 1525.5314 1491.7885 1527.8955 2220.860 100
DT2[, c("id1", "id5")] 614.624 640.617 666.2426 659.0175 676.9355 906.966 100
рдЖрдк рдХреЛрдб рдЪрдВрдХ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рддреАрди рдмреИрдХрдЯрд┐рдХреНрд╕ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рдХреЗ рд╕реНрд╡рд░реВрдкрдг рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
```
code
```
рдпрд╣ рддрдм рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдЬрдм рдореБрдЭреЗ рдХрдИ рдЫреЛрдЯреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЗ рд╕реЗ рд╕рдмрд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рд░-рдмрд╛рд░ рдЫреЛрдЯреА рдЯреЗрдмрд▓ рд╕реЗ рдХреЙрд▓рдо рдЪреБрдирдирд╛ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ, рдФрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ...? рдЪреВрдВрдХрд┐ j
рдореЗрдВ DT[i, j, by]
рдЗрдирдкреБрдЯ рдХреА рдЗрддрдиреА рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд┐рдзрддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рдУрд╡рд░рд╣реЗрдб рд╣реИред
рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ) ... рдЖрдк рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЕрдиреНрдп рдХреЛрд▓реНрд╕ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ , DT[, setdiff(names(DT), cols) := NULL]
рдФрд░ рд╕реАрдзреЗ рдбреАрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╛рд░реА рд░рдЦреЗрдВред
рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рд╕рдмрд╕реЗрдЯ рд▓реЗрдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЙрд▓рдо рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╣рдерд┐рдпрд╛рдирд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣рд╛рдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рд╡рд┐рдХрд▓реНрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕рдВрдкрд╛рджрди рдореВрд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛:
library(data.table)
library(microbenchmark)
N <- 2e8
K <- 100
set.seed(1)
DT <- data.table(
id1 = sprintf("id%03d", 1:K), # large groups (char)
id2 = sprintf("id%03d", 1:K), # large groups (char)
id3 = sprintf("id%010d", 1:(N/K)), # small groups (char)
id4 = sample(K), # large groups (int)
id5 = sample(K), # large groups (int)
id6 = sample(N/K), # small groups (int)
v1 = sample(5), # int in range [1,5]
v2 = sample(5), # int in range [1,5]
v3 = round(runif(100, max = 100), 4), # numeric e.g. 23.5749
row = seq_len(N)
)
cols = c("id1", "id5")
microbenchmark(times = 3,
expression = DT[, .(id1, id5)],
index = DT[, c("id1", "id5")],
dotdot = DT[, ..cols],
oddball = setDT(lapply(setNames(cols, cols), function(x) DT[[x]]))[],
oddball2 = setDT(unclass(DT)[cols])[]
)
Unit: microseconds
expr min lq mean median uq max neval
expression 1249753.580 1304355.3415 1417166.9297 1358957.103 1500873.6045 1642790.106 3
index 1184056.302 1191334.4835 1396372.3483 1198612.665 1502530.3715 1806448.078 3
dotdot 1084521.234 1240062.2370 1439680.6980 1395603.240 1617260.4300 1838917.620 3
oddball 92.659 171.8635 568.5317 251.068 806.4680 1361.868 3
oddball2 66.582 125.9505 150.7337 185.319 192.8095 200.300 3
(рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд░реИрдВрдбрдорд╛рдЗрдЬреЗрд╢рди рд▓рд┐рдпрд╛ рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ # рдЧреБрдирд╛ рдХрдо рдХрд░ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрдзреАрд░ рдерд╛ред)
рдореБрдЭреЗ рдЖрд░ рдХреА рд╕реВрдЪреА рд╕рдмрд╕реЗрдЯ рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ (рдЬреЛ рдКрдкрд░ unclass
рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
"рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕рдВрдкрд╛рджрди рдореВрд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдЧрд╛" рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ:
myDT = data.table(a = 1:2, b = 3:4)
# standard way
res <- myDT[, "a"]
res[, a := 0]
myDT
# a b
# 1: 1 3
# 2: 2 4
# oddball, grabbing pointers
res2 <- setDT(unclass(myDT)["a"])
res2[, a := 0]
myDT
# a b
# 1: 0 3
# 2: 0 4
рдареАрдХ рд╣реИ, рдореБрдЭреЗ рдЖрдЬ рдХреБрдЫ рдирдпрд╛ рдФрд░ рддреЗрдЬ (рдСрдбрдмреЙрд▓) рд╕реАрдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╕реНрдкреАрдб рдФрд░ рдкрд╛рд░рд╕реАрдореЛрдирд┐рдпрд╕ рдХреЛрдбрд┐рдВрдЧ рдХреЗ рдмреАрдЪ рдПрдХ рдЯреНрд░реЗрдб-рдСрдл рд╣реИред рддреЛ рдЧрд┐рд▓рд╛рд╕ рдЖрдзрд╛ рднрд░рд╛ рд╣реИ! рдзрдиреНрдпрд╡рд╛рдж!
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ #852 рд╕рдВрдмрдВрдзрд┐рдд
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЖрдк рдХреЛрдб рдЪрдВрдХ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рддреАрди рдмреИрдХрдЯрд┐рдХреНрд╕ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рдХреЗ рд╕реНрд╡рд░реВрдкрдг рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рд░-рдмрд╛рд░ рдЫреЛрдЯреА рдЯреЗрдмрд▓ рд╕реЗ рдХреЙрд▓рдо рдЪреБрдирдирд╛ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ, рдФрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ...? рдЪреВрдВрдХрд┐
j
рдореЗрдВDT[i, j, by]
рдЗрдирдкреБрдЯ рдХреА рдЗрддрдиреА рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд┐рдзрддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рдУрд╡рд░рд╣реЗрдб рд╣реИредрдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ) ... рдЖрдк рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЕрдиреНрдп рдХреЛрд▓реНрд╕ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ ,
DT[, setdiff(names(DT), cols) := NULL]
рдФрд░ рд╕реАрдзреЗ рдбреАрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╛рд░реА рд░рдЦреЗрдВредрдпрджрд┐ рдЖрдк рдЕрднреА рднреА рд╕рдмрд╕реЗрдЯ рд▓реЗрдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЙрд▓рдо рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╣рдерд┐рдпрд╛рдирд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣рд╛рдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рд╡рд┐рдХрд▓реНрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕рдВрдкрд╛рджрди рдореВрд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛:
(рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд░реИрдВрдбрдорд╛рдЗрдЬреЗрд╢рди рд▓рд┐рдпрд╛ рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ # рдЧреБрдирд╛ рдХрдо рдХрд░ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрдзреАрд░ рдерд╛ред)
рдореБрдЭреЗ рдЖрд░ рдХреА рд╕реВрдЪреА рд╕рдмрд╕реЗрдЯ рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ (рдЬреЛ рдКрдкрд░
unclass
рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред"рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕рдВрдкрд╛рджрди рдореВрд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдЧрд╛" рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ: