比较paste
、paste0
(R版本4.1.0)、stringi::stri_c
(版本1.6.2)和stringr::str_c
(版本1.4.0),我没有观察到很大的性能差异,但这可能取决于要连接什么。如果使用数字或字符并且字符由数字或字母组成,则会有很大的区别。当只有字母时,stringi和stringr似乎比paste更快。
M <- alist(
paste0 = paste0(vec1, "_", vec2)
, paste = paste(vec1, "_", vec2, sep = "")
, pasteS = paste(vec1, vec2, sep = "_")
, stringi = stringi::stri_c(vec1, "_", vec2)
, stringiS = stringi::stri_c(vec1, vec2, sep = "_")
, stringr = stringr::str_c(vec1, "_", vec2)
, stringrS = stringr::str_c(vec1, vec2, sep = "_")
)
set.seed(42)
n <- 1e5
vec1 <- sample(1:10, n, TRUE)
vec2 <- sample(1:1000000000, n, TRUE)
bench::mark(exprs = M)
vec1 <- as.character(vec1)
vec2 <- as.character(vec2)
bench::mark(exprs = M)
set.seed(42)
n <- 1e5
vec1 <- as.character(sample(0:9, n, TRUE))
vec2 <- as.character(sample(0:9, n, TRUE))
bench::mark(exprs = M)
set.seed(42)
n <- 1e5
vec1 <- paste(sample(0:9, n, TRUE))
vec2 <- paste(sample(0:9, n, TRUE))
bench::mark(exprs = M)
expression min median `itr/sec` mem_alloc `gc/sec` n_itr n_gc total_time
<bch:expr> <bch:t> <bch:t> <dbl> <bch:byt> <dbl> <int> <dbl> <bch:tm>
set.seed(42)
n <- 1e5
vec1 <- sample(letters, n, TRUE)
vec2 <- sample(LETTERS, n, TRUE)
bench::mark(exprs = M)
这取决于 character
的内部存储方式。它可以被存储为 CHARSXP
、REALSXP
或 INTSXP
。
x <- as.character(1:2)
.Internal(inspect(x))
x <- as.character(c(0,2))
.Internal(inspect(x))
x <- paste(1:2)
.Internal(inspect(x))
x <- letters[1:2]
.Internal(inspect(x))
glue
包声称比paste0
更快:这里有一个基准测试... https://cran.r-project.org/web/packages/glue/vignettes/speed.html - Stephen Hendersonpaste0
是最快的。请注意,这句话已经被翻译成中文。 - Stephen Henderson