gpt4 book ai didi

performance - Python,迭代正则表达式但在第一次匹配时停止的最快方法

转载 作者:太空狗 更新时间:2023-10-29 17:01:45 25 4
gpt4 key购买 nike

我有一个函数,如果一个字符串至少匹配一个则返回 True列表中的正则表达式,否则为 False。该函数称为性能常常是一个问题。

当通过 cProfile 运行时,该函数花费了大约 65%它的时间用于匹配,35% 的时间用于遍历列表。

我认为会有一种方法可以使用 map() 或其他东西,但我不能想办法让它在找到匹配项后停止迭代。

有没有一种方法可以使函数更快,同时仍然让它返回找到第一个匹配项后?

def matches_pattern(str, patterns):
for pattern in patterns:
if pattern.match(str):
return True
return False

最佳答案

首先想到的是通过生成器表达式将循环推到C端:

def matches_pattern(s, patterns):
return any(p.match(s) for p in patterns)

可能你甚至不需要一个单独的函数。

您应该尝试的另一件事是使用 | 交替运算符构建一个单一的复合正则表达式,以便引擎有机会为您优化它。如果有必要,您还可以从字符串模式列表动态创建正则表达式:

def matches_pattern(s, patterns):
return re.match('|'.join('(?:%s)' % p for p in patterns), s)

当然,您需要使用字符串形式的正则表达式才能正常工作。只需分析这两个并检查哪个更快 :)

您可能还想看看 general tip for debugging regular expressions in Python .这也有助于找到优化机会。

更新:我很好奇并写了一个小基准:

import timeit

setup = """
import re
patterns = [".*abc", "123.*", "ab.*", "foo.*bar", "11010.*", "1[^o]*"]*10
strings = ["asdabc", "123awd2", "abasdae23", "fooasdabar", "111", "11010100101", "xxxx", "eeeeee", "dddddddddddddd", "ffffff"]*10
compiled_patterns = list(map(re.compile, patterns))

def matches_pattern(str, patterns):
for pattern in patterns:
if pattern.match(str):
return True
return False

def test0():
for s in strings:
matches_pattern(s, compiled_patterns)

def test1():
for s in strings:
any(p.match(s) for p in compiled_patterns)

def test2():
for s in strings:
re.match('|'.join('(?:%s)' % p for p in patterns), s)

def test3():
r = re.compile('|'.join('(?:%s)' % p for p in patterns))
for s in strings:
r.match(s)
"""

import sys
print(timeit.timeit("test0()", setup=setup, number=1000))
print(timeit.timeit("test1()", setup=setup, number=1000))
print(timeit.timeit("test2()", setup=setup, number=1000))
print(timeit.timeit("test3()", setup=setup, number=1000))

我机器上的输出:

1.4120500087738037
1.662621021270752
4.729579925537109
0.1489570140838623

所以 any 似乎并不比您原来的方法更快。动态构建正则表达式也不是很快。但是,如果您能够设法预先构建一个正则表达式并多次使用它,这可能会带来更好的性能。您还可以调整此基准测试一些其他选项:)

关于performance - Python,迭代正则表达式但在第一次匹配时停止的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10591068/

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