루프 수를 최소화하여 시간을 단축하고 parallel
패키지 를 사용하여 시간을 줄일 수 있습니다 . 내 접근 방식은 문자열을 한 번 분할 한 다음 루프 정렬 및 붙여 넣기입니다.
sort_cat <- function(strings){
tmp <- strsplit(strings, split="")
tmp <- lapply(tmp, sort)
tmp <- lapply(tmp, paste0, collapse = "")
tmp <- unlist(tmp)
return(tmp)
}
sort_cat2 <- function(strings){
unlist(mcMap(function(i){
stri_join(sort(i), collapse = "")
}, stri_split_regex(strings, "|", omit_empty = TRUE, simplify = F), mc.cores = 8L))
}
> microbenchmark::microbenchmark(
+ old = sort_cat(strings[1:500000]),
+ new = sort_cat2(strings[1:500000]),
+ times = 1
+ )
Unit: seconds
expr min lq mean median uq max neval
old 9.62673395 9.62673395 9.62673395 9.62673395 9.62673395 9.62673395 1
new 5.10547437 5.10547437 5.10547437 5.10547437 5.10547437 5.10547437 1
4 초 정도 면도하지만 여전히 그렇게 빠르지는 않습니다 ...
편집하다
자 apply
.. 전략을 사용하여 아래로 내려갔습니다 .
1) 분할 경계가 아닌 문자 추출 2) 결과가 포함 된 행렬 만들기 3) 행 단위로 반복 4) 정렬 5) 결합
여러 루프와 나열 해제를 피하십시오 .... 무시 : ? caveat는 문자열의 길이가 다른 경우 apply
와 같은 빈 또는 NA를 제거해야합니다.i[!is.na(i) && nchar(i) > 0]
sort_cat3 <- function(strings){
apply(stri_extract_all_regex(strings, "\\p{L}", simplify = TRUE), 1, function(i){
stri_join(stri_sort(i), collapse = "")
})
}
> microbenchmark::microbenchmark(
+ old = sort_cat(strings[1:500000]),
+ mapping = sort_cat2(strings[1:500000]),
+ applying = sort_cat3(strings[1:500000]),
+ times = 1
+ )
Unit: seconds
expr min lq mean median uq max neval
old 10.35101934 10.35101934 10.35101934 10.35101934 10.35101934 10.35101934 1
mapping 5.12771799 5.12771799 5.12771799 5.12771799 5.12771799 5.12771799 1
applying 3.97775326 3.97775326 3.97775326 3.97775326 3.97775326 3.97775326 1
10.3 초에서 3.98 초로 이동