性能比较stringr - str_replace_all

时间:2016-10-07 17:17:45

标签: performance-testing str-replace 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个文档执行相同的过程并且每个文档文件更长时会更快?

1 个答案:

答案 0 :(得分:0)

很明显,通过一次str_replace_all调用,您可以获得更好的效果,因为您无需更改text值。请注意,当您需要调用str_replace_all来更改text值时,您需要在每次更换时重新分配值,这意味着需要额外的开销。

以下是包含3个函数的测试:f1使用第一种方法,f2使用第二种方法,而f3只是一个&#34;链接&#34;版本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,函数运行50,000次,中位数值,f2最低,下四分位( lq)和上四分位(uq)值,证明单个str_replace_all是最快的。 autoplot(test)(来自ggplot2图书馆)显示: enter image description here

最后,如果您只需要替换文字字符串,最好使用 stringi 包中的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