Regex 微基准R和三个关于字符串模式替换的包
我的问题是我的方法和结论是否正确 作为学习正则表达式的一部分,我想找出学习各种可选方法(base R和包)的顺序。我认为这可能有助于了解替代函数的相对速度。所以,我创建了一个字符串向量并调用了我希望是等价表达式的东西Regex 微基准R和三个关于字符串模式替换的包,regex,r,benchmarking,Regex,R,Benchmarking,我的问题是我的方法和结论是否正确 作为学习正则表达式的一部分,我想找出学习各种可选方法(base R和包)的顺序。我认为这可能有助于了解替代函数的相对速度。所以,我创建了一个字符串向量并调用了我希望是等价表达式的东西 sites <- c("http://grand.test.com/", "https://example.com/", "http://.big.time.bhfs.com/", "http://test.blogs.mvalaw.com/") v
sites <- c("http://grand.test.com/", "https://example.com/",
"http://.big.time.bhfs.com/", "http://test.blogs.mvalaw.com/")
vec <- rep(x = sites, times = 1000) # creating a longish vector
base <- gsub("http:", "", vec, perl = TRUE)
stringr <- str_replace_all(vec, "http:", replacement = "")
stringi <- stri_replace_all_regex(str = vec, pattern = "http:", replacement = "")
qdap <- genX(text.var = vec, "http:", "")
基本Rgsub
是迄今为止最快的(我缩短了expr名称),我说的对吗
中位数时间非常明显不同,尤其是对于
qdap
,这些函数各有其用途。但是,如果您查看str\u replace\u all
的帮助文件,您会发现它链接并包装了gsub
,这意味着它在某个时候调用了gsub
。在这种情况下,gsub
很可能是最快的,因为它调用了一个.Internal
函数,该函数由C代码和R代码组成。调用.Internal
或是.Primitive
的函数通常是最快的,因为内部C代码有几个旁注sub
比gsub
稍微快一点,看起来在这里就足够了。请注意,“http:”与“https:”不匹配。您可以将模式更改为“https:”,以选择性地包含sAlso注意,在本例中,使用fixed=TRUE
而不是perl=TRUE
会使gsub
更快(在我的机器上仅0.7毫秒。但速度更快)。您在这里使用qdap
让我惊讶的是,它居然工作了genX
用于删除两个标记之间的项(因此是left
和right
参数)。该函数旨在减少使用正则表达式的编程时间,而不是计算时间,作为基本函数的包装器,我希望它无论如何都会变慢。无论如何,如果gsub
(或stringi
/stringr
软件包)更适合执行某项任务,我不会使用genX
。@律师,我不能代表软件包的作者说话,只能从stringr
描述文件:描述:stringr是一组简单的包装器,使R的字符串函数更一致、更简单、更易于使用。它通过确保:函数和参数名称(和位置)一致,所有函数适当处理NA和零长度字符,每个函数的输出数据结构与其他函数的输入数据结构匹配来实现此目的。”
test <- microbenchmark(base <- gsub("http:", "", vec, perl = TRUE),
stringr <- str_replace_all(vec, "http:", replacement = ""),
stringi <- stri_replace_all_regex(str = vec, pattern = "http:", replacement = ""),
qdap <- genX(text.var = vec, "http:", ""),
times = 100)
expr min lq
base 1.697001 1.739393
stringr 3.814348 3.928360
stringi 5.888857 6.172212
qdap 120.670037 124.624946
median uq max neval
1.765051 1.833770 2.976780 100
3.979453 4.123138 7.032091 100
6.276407 6.500412 7.634943 100
127.493293 130.923663 173.155253 100