首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在Python中捕获组时regex搜索速度较慢?

为什么在Python中捕获组时regex搜索速度较慢?
EN

Stack Overflow用户
提问于 2017-01-03 13:38:58
回答 2查看 2.6K关注 0票数 21

我有一个应用程序代码,它可以从配置动态生成正则表达式,用于某些解析。当两个变体的定时性能时,捕获OR正则表达式的每个部分的正则表达式变化明显慢于普通正则表达式。原因是regex模块内部某些操作的开销。

代码语言:javascript
运行
复制
>>> import timeit
>>> setup = '''
... import re
... '''   

#no capture group 
>>> print(timeit.timeit("re.search(r'hello|bye|ola|cheers','some say hello,some say bye, or ola or cheers!')", setup=setup))
0.922958850861

#with capture group
>>> print(timeit.timeit("re.search(r'(hello)|(bye)|(ola)|(cheers)','some say hello,some say bye, or ola or cheers!')", setup=setup))
1.44321084023

#no capture group
>>> print(timeit.timeit("re.search(r'hello|bye|ola|cheers','some say hello,some say bye, or ola or cheers!')", setup=setup))
0.913202047348

# capture group
>>> print(timeit.timeit("re.search(r'(hello)|(bye)|(ola)|(cheers)','some say hello,some say bye, or ola or cheers!')", setup=setup))
1.41544604301

问题:是什么导致了在使用捕获组时性能显著下降的原因?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-03 13:48:34

您的模式仅在捕获组中有所不同。当您在regex模式中定义一个捕获组并在re.search中使用该模式时,结果将是一个MatchObject实例。每个match对象将包含尽可能多的组,就像模式中的捕获组一样,即使它们是空的。这是re内部的开销:添加组(列表)(内存分配等)。请注意,组还包含https://docs.python.org/2/howto/regex.html#grouping等详细信息(请参阅 reference)。

票数 12
EN

Stack Overflow用户

发布于 2017-01-03 13:48:55

原因很简单,使用捕获组表示引擎在内存中保存内容,而使用非捕获组表示引擎没有保存任何内容。考虑到您正在告诉引擎执行更多的操作。

例如,使用这个正则表达式(hello|bye|ola|cheers)(hello)|(bye)|(ola)|(cheers)比使用原子组或非捕获组(如(?:hello|bye|ola|cheers) )的影响要大得多。

在使用regex时,您知道是否要捕获内容,就像上面的情况一样。如果您想捕获其中任何一个单词,您将失去性能,但如果不需要捕获内容,则可以通过使用非捕获组来提高性能。

我知道您标记了python,但是已经为javascript准备了一个在线基准测试,以显示捕获和非捕获组对js regex引擎的影响。

https://jsperf.com/capturing-groups-vs-non-capturing-groups

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41444807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档