Plus rapide Python méthode pour rechercher et remplacer sur une grande chaîne

Je suis à la recherche de la façon la plus rapide de remplacer un grand nombre de sous-chaînes de caractères à l'intérieur d'une très grande chaîne. Voici deux exemples que j'ai utilisés.

findall() se sent plus simple et plus élégante, mais elle prend une étonnante quantité de temps.

finditer() enflamme un gros fichier, mais je ne suis pas sûr que ce soit la bonne façon de le faire.

Voici un exemple de code. Notez que le texte actuel je suis intéressé par une chaîne unique autour de 10 MO en taille, et il y a une énorme différence entre ces deux méthodes.

import re

def findall_replace(text, reg, rep):
    for match in reg.findall(text):
        output = text.replace(match, rep)
    return output

def finditer_replace(text, reg, rep):
    cursor_pos = 0
    output = ''
    for match in reg.finditer(text):
        output += "".join([text[cursor_pos:match.start(1)], rep])
        cursor_pos = match.end(1)
    output += "".join([text[cursor_pos:]])
    return output

reg = re.compile(r'(dog)')
rep = 'cat'
text = 'dog cat dog cat dog cat'

finditer_replace(text, reg, rep)

findall_replace(text, reg, rep)

Mise à JOUR Ajouté re.sous méthode d'essais:

def sub_replace(reg, rep, text):
    output = re.sub(reg, rep, text)
    return output

Résultats

re.sub() - 0:00:00.031000
finditer() - 0:00:00.109000
findall() - 0:01:17.260000

et la deuxième est vraiment beaucoup plus rapide? Me semble étrange, ils devraient prendre environ. même temps. Et je pense que tous les moyens sont corrects.
pourquoi n'êtes-vous pas à l'aide de re sous méthode?
À l'aide de += avec des cordes est un O(n^2), par rapport à l'O(n), de la construction d'une liste et à l'aide de "" à la rejoindre.
Sören: oui, la différence entre les deux méthodes est profonde.
C'est un exemple très simplifié? Parce que vous pouvez simplement utiliser the_string.replace('dog', 'cat'). Si elle l'est, comment compliqué, c'est de la réelle regex?

OriginalL'auteur cyrus | 2011-02-04