Рассмотрим этот код Python:
import timeit
import re
def one():
any(s in mystring for s in ('foo', 'bar', 'hello'))
r = re.compile('(foo|bar|hello)')
def two():
r.search(mystring)
mystring="hello"*1000
print([timeit.timeit(k, number=10000) for k in (one, two)])
mystring="goodbye"*1000
print([timeit.timeit(k, number=10000) for k in (one, two)])
В принципе, я сравниваю два способа проверить наличие одной из нескольких подстрок в большой строке.
То, что я получаю здесь (Python 3.2.3), является следующим:
[0.36678314208984375, 0.03450202941894531]
[0.6672089099884033, 3.7519450187683105]
В первом случае регулярное выражение легко побеждает выражение any
- регулярное выражение сразу находит подстроку, а any
должно проверять всю строку пару раз, прежде чем оно попадет в правильную подстроку.
Но что происходит во втором примере? В случае, когда подстрока отсутствует, регулярное выражение на удивление медленное! Это меня удивляет, так как теоретически регулярное выражение должно переходить только через строку, а выражение any
должно пройти по строке 3 раза. Что здесь не так? Есть ли проблема с моим регулярным выражением или регулярные выражения Python просто замедляются в этом случае?