Tôi đang tìm tốc độ càng nhiều càng tốt và ở lại cơ sở để làm những gì expand.grid
làm. Tôi đã sử dụng outer
cho các mục đích tương tự trong quá khứ để tạo ra một véc tơ; một cái gì đó như thế này:Sử dụng bên ngoài thay vì expand.grid
v <- outer(letters, LETTERS, paste0)
unlist(v[lower.tri(v)])
điểm chuẩn đã cho tôi thấy rằng outer
có thể mạnh nhanh hơn expand.grid
nhưng lần này tôi muốn tạo hai cột giống như expand.grid
(tất cả combo có thể cho 2 vectơ) nhưng phương pháp của tôi với outer
không điểm chuẩn nhanh với thời gian bên ngoài.
tôi hy vọng để mất 2 vectơ và tạo mọi kết hợp có thể là hai cột càng nhanh càng tốt (tôi nghĩ outer
thể là con đường nhưng tôi rộng mở cho bất kỳ phương pháp cơ bản.
Dưới đây là phương pháp expand.grid
và . outer
phương pháp
dat <- cbind(mtcars, mtcars, mtcars)
expand.grid(seq_len(nrow(dat)), seq_len(ncol(dat)))
FOO <- function(x, y) paste(x, y, sep=":")
x <- outer(seq_len(nrow(dat)), seq_len(ncol(dat)), FOO)
apply(do.call("rbind", strsplit(x, ":")), 2, as.integer)
Các microbenchmarking lãm outer
chậm:
# expr min lq median uq max
# EXPAND.G 812.743 838.6375 894.6245 927.7505 27029.54
# OUTER 5107.871 5198.3835 5329.4860 5605.2215 27559.08
Tôi nghĩ rằng việc sử dụng outer
của tôi chậm vì tôi không biết cách sử dụng outer
để trực tiếp tạo chiều dài 2 véc tơ mà tôi có thể do.call('rbind'
cùng nhau. Tôi phải làm chậm paste
và chia nhỏ. Làm thế nào tôi có thể làm điều này với outer
(hoặc các phương pháp khác trong base
) theo cách nhanh hơn expand grid
?
CHỈNH SỬA: Thêm kết quả microbenchmark.
**
Unit: microseconds
expr min lq median uq max
1 ERNEST 34.993 39.1920 52.255 57.854 29170.705
2 JOHN 13.997 16.3300 19.130 23.329 266.872
3 ORIGINAL 352.720 372.7815 392.377 418.738 36519.952
4 TOMMY 16.330 19.5960 23.795 27.061 6217.374
5 VINCENT 377.447 400.3090 418.505 451.864 43567.334
**
Tyler, bạn có thêm phương pháp của tôi vào danh sách điểm chuẩn không? Nó phải bằng một nửa tốc độ nhanh nhất bạn có ở đây. – John
Đúng vậy. Nó thực sự là nhanh nhất. –