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

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

概述我从下面的第一个代码片段开始搜索行列表,并将每行中的所有关键字(在单独的列表中标识)转换为小写.对于我的大约800行长的测试列表,只要我的关键字列表是100个项目或更少,整个行列表的关键字替换只需不到一秒.当我将列表扩展到101个或更多项时,处理时间会超过9秒. 使用第二个片段(编译关键字列表的所有模式)会将总处理时间减少到1秒以下. 有谁知道为什么非编译替换搜索的处理时间对每个输入行搜索的项目数 我从下面的第一个代码片段开始搜索行列表,并将每行中的所有关键字(在单独的列表中标识)转换为小写.对于我的大约800行长的测试列表,只要我的关键字列表是100个项目或更少,整个行列表的关键字替换只需不到一秒.当我将列表扩展到101个或更多项时,处理时间会超过9秒.

@H_502_8@

使用第二个片段(编译关键字列表的所有模式)会将总处理时间减少到1秒以下.@H_502_8@

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

片段#1@H_502_8@

@H_502_8@

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

片段#2@H_502_8@

@H_502_8@

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],0)
解决方法 这是因为Python在内部缓存已编译的正则表达式,并且内部缓存的大小为100(在第227行可以看到 here.此外,您可以在第246-247行看到当缓存超过最大大小时它是清除而不是使用更高级的缓存失效算法.这实质上意味着循环的每次迭代都会耗尽缓存并导致重新编译所有100个正则表达式.

@H_502_8@

在第二个示例中,性能恢复到“正常”,因为它不依赖于内部缓存保持原样以保持编译的正则表达式.@H_502_8@ 总结

以上是内存溢出为你收集整理的python – 正则表达式执行时间在第100个模式后急剧跳跃全部内容,希望文章能够帮你解决python – 正则表达式执行时间在第100个模式后急剧跳跃所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1192669.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存