Tim Peters <t...@python.org> added the comment:

Note that the relatively tiny pattern here extracts just a small piece of the 
regexp in question. As the output shows, increase the length of a string it 
fails to match by one character, and the time taken to fail approximately 
doubles: exponential-time behavior.

>>> import re
>>> c = re.compile(r'(?:[^\s()<>]+)+x')
>>> from time import perf_counter as now
>>> size = 1
>>> while True:
...     s = 'a' * size
...     start = now()
...     junk = c.search(s)
...     finish = now()
...     print(size, finish - start)
...     size += 1
        
1 9.900000009110954e-06
2 1.1800000009998257e-05
3 1.1200000017197453e-05
4 1.2099999992187804e-05
5 1.5200000007098424e-05
6 1.5699999977414336e-05
7 2.119999999194988e-05
8 3.39000000053602e-05
9 4.9599999982774534e-05
10 7.779999998547282e-05
11 0.00014810000001830304
12 0.00034099999999170905
13 0.0006348999999943317
14 0.0012191000000143504
15 0.002482499999985066
16 0.004694100000023127
17 0.009342199999991863
18 0.01954169999999067
19 0.03880150000000526
20 0.0762141000000156
21 0.1472148999999945
22 0.27771670000001336
23 0.6491722000000095
24 1.3553119999999979
25 2.229829699999982
26 4.986566299999993
27 9.567925599999995
28 19.09181079999999
29 42.363349
30 83.57493059999999
31 158.88249489999998
...

The machine was far from quiet while running this, but it doesn't matter: the 
_point_ is dead obvious regardless.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue40879>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to