gpt4 book ai didi

regex - gsub 速度与图案长度

转载 作者:行者123 更新时间:2023-12-03 10:29:57 24 4
gpt4 key购买 nike

我一直在使用gsub最近广泛使用,我注意到短模式比长模式运行得更快,这并不奇怪。这是一个完全可重现的代码:

library(microbenchmark)
set.seed(12345)
n = 0
rpt = seq(20, 1461, 20)
msecFF = numeric(length(rpt))
msecFT = numeric(length(rpt))
inp = rep("aaaaaaaaaa",15000)

for (i in rpt) {
n = n + 1
print(n)
patt = paste(rep("a", rpt[n]), collapse = "")
#time = microbenchmark(func(count[1:10000,12], patt, "b"), times = 10)
timeFF = microbenchmark(gsub(patt, "b", inp, fixed=F), times = 10)
msecFF[n] = mean(timeFF$time)/1000000.

timeFT = microbenchmark(gsub(patt, "b", inp, fixed=T), times = 10)
msecFT[n] = mean(timeFT$time)/1000000.
}

library(ggplot2)
library(grid)
library(gridExtra)

axis(1,at=seq(0,1000,200),labels=T)

p1 = qplot(rpt, msecFT, xlab="pattern length, characters", ylab="time, msec",main="fixed = TRUE" )
p2 = qplot(rpt, msecFF, xlab="pattern length, characters", ylab="time, msec",main="fixed = FALSE")
grid.arrange(p1, p2, nrow = 2)

如您所见,我正在寻找包含 a 的模式。复制 rpt[n]次。正如预期的那样,斜率为正。但是,我注意到 fixed=T 在 300 个字符处出现扭结。和 600 个字符, fixed=F然后斜率似乎与以前大致相同(见下图)。
我想,这是由于内存、对象大小等原因。我还注意到允许的最长 pattern是 1463 个符号,对象大小为 1552 字节。

有人可以更好地解释这个扭结,为什么要 300 和 600 个字符?

gsub speed in milliseconds with fixed turned on/off as a function of pattern length in characters

补充:值得一提的是,我的大多数模式都是 5-10 个字符长,这为我的真实数据(不是上面示例中的模型 inp)提供了以下时间。
gsub, fixed = TRUE: ~50 msec per one pattern
gsub, fixed = FALSE: ~190 msec per one pattern
stringi, fixed = FALSE: ~55 msec per one pattern
gsub, fixed = FALSE, perl = TRUE: ~95 msec per one pattern

(我有 4k 模式,所以我的模块的总时间大约是 200 秒,这恰好是 0.05 x 4000 与 gsub 和固定 = TRUE。这是我的数据和模式最快的方法)

Real data timing

最佳答案

扭结可能与保持该长度模式所需的位有关。

还有另一种扩展性更好的解决方案,使用重复运算符 {}指定要查找的重复次数。为了找到超过 255 个(最大 8 位整数),您必须指定 perl = TRUE .

patt2 <- paste0('a{',rpt[n],'}')
timeRF <- microbenchmark(gsub(patt2, "b", inp, perl = T), times = 10)

我每次搜索的速度约为 2.1 毫秒,而模式长度没有任何损失。对于小图案长度,这比固定 = FALSE 快约 8 倍,对于大图案长度,快约 60 倍。

关于regex - gsub 速度与图案长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27534296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com