Ho una stringa abbastanza grande (~ 700k) rispetto alla quale ho bisogno di eseguire 10 regex e contare tutte le corrispondenze di qualsiasi regex. Il mio impl veloce e sporco doveva fare qualcosa come re.search ('(expr1) | (expr2) | ...'), ma mi stavo chiedendo se avremmo visto qualche guadagno in termini di prestazioni confrontando in un ciclo invece:regex '|' operatore vs esecuzioni separate per ogni sottoespressione
In altre parole, voglio mettere a confronto le prestazioni di:
def CountMatchesInBigstring(bigstring, my_regexes):
"""Counts how many of the expressions in my_regexes match bigstring."""
count = 0
combined_expr = '|'.join(['(%s)' % r for r in my_regexes])
matches = re.search(combined_expr, bigstring)
if matches:
count += NumMatches(matches)
return count
vs
def CountMatchesInBigstring(bigstring, my_regexes):
"""Counts how many of the expressions in my_regexes match bigstring."""
count = 0
for reg in my_regexes:
matches = re.search(reg, bigstring)
if matches:
count += NumMatches(matches)
return count
smetto di essere pigro ed eseguire alcuni test di domani (e dopo i risultati), ma mi chiesi se la risposta salterà a qualcuno che in realtà capisce come funzionano le regex :)
Poiché ogni espressione regolare nei suoi esempi viene utilizzata solo una volta, non è necessario ottenere alcun miglioramento delle prestazioni mediante la pre-compilazione. –
anche se hai usato ogni regex più di una volta, il modulo re di python già memorizza nella cache le regex compilate per te, quindi nel secondo tempo userebbe comunque la pre-compilazione. – nosklo