El módulo de Python re se vuelve 20 veces más lento cuando se repite en más de 100 expresiones regulares diferentes

Mi problema es analizar los archivos de registro y eliminar partes variables en cada línea para agruparlos. Por ejemplo:

s = re.sub(r'(?i)User [_0-9A-z]+ is ', r"User .. is ", s)
s = re.sub(r'(?i)Message rejected because : (.*?) \(.+\)', r'Message rejected because : \1 (...)', s)

Tengo alrededor de más de 120 reglas coincidentes como las anteriores.

No he encontrado problemas de rendimiento al buscar sucesivamente en 100 expresiones regulares diferentes. Pero una gran desaceleración se produce cuando se aplican 101 expresiones regulares.

El mismo comportamiento se produce exactamente al reemplazar mis reglas con

for a in range(100):
    s = re.sub(r'(?i)caught here'+str(a)+':.+', r'( ... )', s)

Se volvió 20 veces más lento cuando se usa el rango (101).

# range(100)
% ./dashlog.py file.bz2
== Took  2.1 seconds.  ==

# range(101)
% ./dashlog.py file.bz2
== Took  47.6 seconds.  ==

¿Por qué está pasando algo así? ¿Y hay alguna solución conocida?

(Sucede en Python 2.6.6 / 2.7.2 en Linux / Windows).

Respuestas a la pregunta(1)

Su respuesta a la pregunta