gpt4 book ai didi

python - 正则表达式执行时间在第 100 个模式后急剧跳跃

转载 作者:太空宇宙 更新时间:2023-11-03 13:22:44 26 4
gpt4 key购买 nike

我从下面的第一个代码片段开始搜索行列表并将每行中的所有关键字(在单独的列表中标识)转换为小写。对于我的大约 800 行长的测试列表,只要我的关键字列表不超过 100 项,整个行列表的关键字替换只需不到一秒钟的时间。当我将列表扩展到 101 个或更多项目时,处理时间跳到 9 秒以上。

使用第二个代码段(编译关键字列表的所有模式)将总处理时间降低到 1 秒以下。

有谁知道为什么非编译替换搜索的处理时间对每个输入行搜索的项目数如此敏感?我很惊讶它在 100 个关键字后跳得如此之快。

片段 #1

for line in lines_in:
for keyword in keywords:
rawstring = r'\b' + keyword + r'\b'
line = re.sub(rawstring, keyword, line, 0, re.IGNORECASE)

片段 #2

for i in range(len(keywords)):
re_pattern = re.compile(r'\b' + keywords[i] + r'\b', re.IGNORECASE)
pattern.append(re_pattern)

for line in lines_in:
for i in range(len(keywords)):
line = pattern[i].sub(keywords[i], line, 0)

最佳答案

这是因为 Python 在内部缓存了编译后的正则表达式,并且该内部缓存的大小为 100(如第 227 行的 here 所示。此外,您可以在第 246-247 行看到当缓存结束时它被清除的最大大小,而不是使用更高级的缓存失效算法。这实质上意味着循环的每次迭代都会耗尽缓存并导致重新编译所有 100 多个正则表达式。

在您的第二个示例中,性能恢复到“正常”状态,因为它不依赖于保持完整的内部缓存来保持已编译的正则表达式。

关于python - 正则表达式执行时间在第 100 个模式后急剧跳跃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8958865/

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