2016-10-07 2 views
1

Просто интересно, будут ли различия в производительности в работе str_replace_all.сравнение производительности stringr - str_replace_all

Например:

text <- c("a","b", "c") 
str_replace_all(text, c("a", "b", "c"), c("d", "e", "f")) 

и

str_replace_all(text, "a", "d") 
str_replace_all(text, "b", "e") 
str_replace_all(text, "c", "f") 

И поймите меня тот же результат, но я задавался вопросом, что было бы быстрее, если бы я делал ту же процедуру для близко к 200.000 документов и если каждый файл документа был длиннее?

+0

Как почти всегда в случае вопросов с производительностью, ответ «это зависит» и/или «не беспокойтесь об этом, пока не увидите проблему». Реальный ответ - «проверить это». –

ответ

0

Очевидно, что у вас будет лучшая производительность с помощью одного звонка 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 библиотеки) показывает: enter image description here

И, наконец, лучше всего использовать 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