我有一个相当大的字符串(~700k),我需要运行10个正则表达式并计算所有正则表达式的匹配数。我的急功近利是做些类似搜索('(expr1)|(expr2)|…),但我想知道我们是否可以通过在循环中匹配来获得性能提升:
换句话说,我想比较一下:
def CountMatchesInBigstring(bigstring, my_regexes):
"""Counts how many of the expressions in my_regexes match bigstring."""
count = 0
combined_expr = '|'.join(['(%s)' % r for r in my_regexes])
matches = re.search(combined_expr, bigstring)
if matches:
count += NumMatches(matches)
return count
与
^{pr2}$我不会再偷懒了,明天再运行一些测试(并发布结果),但我想知道答案是否会跳出一个真正了解regex如何工作的人:)
我相信您的第一次实施会更快:
这两种方法得到的结果会略有不同,除非保证一个匹配项只匹配一个正则表达式。否则,如果某个值与2匹配,则将计数两次。在
理论上,您的解决方案应该更快(如果表达式是互斥的),因为regex编译器应该能够创建一个更有效的搜索状态机,因此只需要一个过程。不过,我希望差别很小,除非表达式非常相似。在
另外,如果它是一个巨大的字符串(大于700k),那么只需一次就可以获得收益,因此所需的内存交换(到磁盘或cpu缓存)要少n倍。在
我打赌在你的测试中,这并不是很明显。我对实际结果感兴趣-请务必张贴结果。在
要理解re模块的工作原理,请在调试模式下编译Šsre.c(将#define VERBOSE放到103行,然后重新编译python)。在这之后,你会看到这样的情况:
相关问题 更多 >
编程相关推荐