只是想知道在运行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
只是一个&#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
图书馆)显示:
最后,如果您只需要替换文字字符串,最好使用 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