Очевидно, что у вас будет лучшая производительность с помощью одного звонка str_replace_all
, так как вам не нужно менять значение text
. См., Когда вам нужно позвонить str_replace_all
, чтобы изменить значение text
, вам нужно повторно назначить значение при каждом замене, а это означает дополнительные накладные расходы.
Вот тест с 3 функциями: f1
использует первый подход, f2
использует второй и f3
просто «прикован» версия f2
:
> library(microbenchmark)
> text <- c("a", "b", "c")
> f1 <- function(text) { text=str_replace_all(text, "a", "d"); text = str_replace_all(text, "b", "e"); text=str_replace_all(text, "c", "f"); return(text) }
> f1(text)
[1] "d" "e" "f"
> f2 <- function(text) { return(str_replace_all(text, c("a", "b", "c"), c("d", "e", "f"))) }
> f2(text)
[1] "d" "e" "f"
> f3 <- function(text) { return(str_replace_all(str_replace_all(str_replace_all(text, "c", "f"), "b", "e"), "a", "d")) }
> f3(text)
[1] "d" "e" "f"
> test <- microbenchmark(f1(text), f2(text), f3(text), times = 50000)
> test
Unit: microseconds
expr min lq mean median uq max neval
f1(text) 225.788 233.335 257.2998 239.673 262.313 25071.76 50000
f2(text) 182.321 187.755 207.1858 191.980 210.393 24844.76 50000
f3(text) 224.581 231.825 255.2167 237.863 259.898 24531.74 50000
С times = 50000
функция выполнялась 50000 раз а средний значение , будучи самым низким с f2
вместе с нижней квартили (LQ) и верхней квартили (UQ) значений, доказывает, что один str_replace_all
является самым быстрым. autoplot(test)
(из ggplot2
библиотеки) показывает:
И, наконец, лучше всего использовать stri_replace_all_fixed
из пакет стринги, если вам нужно только заменить буквенные строки. Тогда вот эталонный показатель:
> library(stringi)
> f1 <- function(text) { text=stri_replace_all_fixed(text, "a", "d"); text = stri_replace_all_fixed(text, "b", "e"); text=stri_replace_all_fixed(text, "c", "f"); return(text) }
> f2 <- function(text) { return(stri_replace_all_fixed(text, c("a", "b", "c"), c("d", "e", "f"))) }
> f3 <- function(text) { return(stri_replace_all_fixed(stri_replace_all_fixed(stri_replace_all_fixed(text, "c", "f"), "b", "e"), "a", "d")) }
> test <- microbenchmark(f1(text), f2(text), f3(text), times = 50000)
> test
Unit: microseconds
expr min lq mean median uq max neval cld
f1(text) 7.547 7.849 9.197490 8.151 8.453 1008.800 50000 b
f2(text) 3.321 3.623 4.420453 3.925 3.925 2053.821 50000 a
f3(text) 7.245 7.547 9.802766 7.849 8.151 50816.654 50000 b
Как почти всегда в случае вопросов с производительностью, ответ «это зависит» и/или «не беспокойтесь об этом, пока не увидите проблему». Реальный ответ - «проверить это». –