Tôi gặp phải sự cố hơi giống với câu hỏi this. tôi quấn giải pháp của bạn vào chức năng để so sánh tốt hơn:
goreF <- function(x,y,proportion){
temp <- setkey(setkey(x[, c(k = 1, .SD)], k)[y[,c(k = 1, .SD)],
allow.cartesian = TRUE][, k := NULL],
a, c)
temp <- temp[setkey(proportion, a, c)][, prop := prop/.N, by = .(a, c)]
chosen_pairs <- temp[, .SD[sample(.N, 5, replace = FALSE, prob = prop)],
by = a]
chosen_pairs
}
cách tiếp cận của tôi:
myFunction <- function(x, y, proportion){
temp <- setkey(setkey(x[, c(k = 1, .SD)], k)[y[,c(k = 1, .SD)],
allow.cartesian = TRUE][, k := NULL],
a, c)
temp <- temp[setkey(proportion, a, c)][, prop := prop/.N, by = .(a, c)]
chosen_pairs <- temp[, sample(.I, 5, replace = FALSE, prob = prop), by = a]
indexes <- chosen_pairs[[2]]
temp[indexes]
}
require(rbenchmark)
benchmark(myFunction(x, y, proportion), goreF(x, y, proportion),
replications = 1,
columns = c("test", "replications", "elapsed", "relative",
"user.self", "sys.self"))
test replications elapsed relative user.self sys.self
2 goreF(x, y, proportion) 1 19.83 21.323 19.35 0.13
1 myFunction(x, y, proportion) 1 0.93 1.000 0.86 0.08
lẽ có thể được tìm thấy nhiều cải tiến hơn, tôi sẽ cập nhật, nếu tìm thấy bất kỳ. Hai hoạt động đầu tiên có vẻ quá phức tạp, có thể chúng có thể được rút ngắn, nhưng, vì tôi không thấy rằng chúng tác động đến thời gian tính toán, nên tôi đã không viết lại chúng.
Cập nhật:
Như đã chỉ ra trong câu hỏi tôi đã đề cập ở phần đầu, bạn có thể gặp rắc rối với myFunction
, nếu nhóm của bạn sẽ chỉ chứa một phần tử. Vì vậy, tôi đã sửa đổi nó, dựa trên các nhận xét từ bài đăng đó.
myFunction2 <- function(x, y, proportion){
temp <- setkey(setkey(x[, c(k = 1, .SD)], k)[y[,c(k = 1, .SD)],
allow.cartesian = TRUE][, k := NULL],
a, c)
temp <- temp[setkey(proportion, a, c)][, prop := prop/.N, by = .(a, c)]
indexes <- temp[, .I[sample(.N, 5, replace = T, prob = prop)], by = a]
indexes <- indexes[[2]]
temp[indexes]
}
benchmark(myFunction(x, y, proportion), myFunction2(x, y, proportion),
replications = 5,
columns = c("test", "replications", "elapsed", "relative",
"user.self", "sys.self"))
test replications elapsed relative user.self sys.self
1 myFunction(x, y, proportion) 5 6.61 1.064 6.23 0.36
2 myFunction2(x, y, proportion) 5 6.21 1.000 5.71 0.26
Chúng tôi có thể thấy cải thiện tốc độ biên.
Tại sao bạn tính toán lại xác suất trong dòng thứ hai của giải pháp? – minem
@ MārtiņšMiglinieks Tôi chuẩn hóa các xác suất như đối với một cặp '(a, c)' đã cho có thể có nhiều 'b' –
Lookup' .EACHI', khi tham gia chéo cho phép bạn xử lý phần được nối trong mỗi hoạt động, mà không giải quyết việc tham gia đầy đủ trong mem. – Shape