Mam kod aplikacji, który generuje reguła dynamicznie z config dla niektórych parsowania. Podczas sprawdzania w czasie dwóch wersji zmienna regex z każdą częścią wyodrębnianego wyrażenia OR jest zauważalnie wolniejsza od zwykłego wyrażenia regularnego niż . Powód byłby narzutem pewnych operacji wewnętrznych w module regex.Dlaczego wyszukiwanie regex jest wolniejsze dzięki przechwytywaniu grup w Pythonie?
>>> 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.84023
#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
Pytanie: Co powoduje to znaczny spadek wydajności podczas korzystania z grupy przechwytywania?
Już napisałem, że * powodem byłoby narzut niektórych operacji wewnętrznie w module regex. * Co to są Państwo zainteresowani? Co się stanie, jeśli we wzorcu zostaną przechwycone grupy? –
Określasz * w Pythonie * - czy mówisz, że moduł Python 're' jest znacznie wolniejszy niż silnik RE w innym języku (używając tego samego RE i danych)? Jeśli tak, czy mógłbyś pokazać dokonane porównania, proszę? – cdarke
@ WiktorStribiżew Tak, interesuje się tym, co powoduje to wewnętrznie. – DhruvPathak