11
votes

La mise en œuvre la plus rapide de faire plusieurs substitutions de chaîne en python

Y a-t-il une façon recommandée de faire plusieurs substitutions de chaînes autres que de faire remplacer code> enchaînant sur une chaîne (c.-à-d. text.replace (A, B) .replace (c, d) .replace (E, F) ... code>)? Comment choisiriez-vous, par exemple, implémenter une fonction rapide qui se comporte comme des htmlspecialchars de PHP code> dans python?

i comparé (1) multiple remplacer code> méthode (2) Méthode d'expression, et (3) la méthode de Matt Anderson. P>

avec n = 10 exécutions, les résultats sont venus comme suit: p>

sur 100 caractères: p>

TIME: 1.277524 sec [ replace_method(str) ]
TIME: 1.290590 sec [ regular_expression_method(str, dict) ]
TIME: 1.116601 sec [ matts_multi_replace_method(list, str) ]


3 commentaires

Bonne discussion ici Stackoverflow.com/Questtions/3367809/...


Tim, seul le commentaire utile sur la page est un par Alex. Il donne un exemple pour la méthode de substitution d'expression régulière linéaire que j'ai vérifiée comme étant plus lente sur un document de taille de 3,5 m avec 5 paires de substitution. Donc, cela ne me donne pas une nouvelle idée.


Avez-vous besoin que le résultat de la première substitution soit disponible pour participer à la prochaine substitution (comme il serait dans votre exemple de chaînage de remplacement)? Ou voulez-vous que toutes les substitutions fonctionnent uniquement sur le texte d'origine? Si ce dernier, avez-vous quelque chose en tête sur la façon de les hiérarchiser si le chevauchement ou autrement en conflit?


3 Réponses :


0
votes

À quelle vitesse? Aussi, quelle est la taille de vos cordes?

Il y a une assez simple Recette pour la construction d'un expression régulière pour faire le travail sur un autre site. Il pourrait avoir besoin de quelque souille pour gérer les métacarceurs de regex; Je n'ai pas l'air de trop près.

Si cela n'est pas assez bon, vous devez probablement écrire du code C, honnêtement. Vous pouvez construire une machine à états simple pour effectuer tous les remplacements, puis traiter n'importe quel octet de chaîne par octet sans retour en arrière le long de la machine pour effectuer le travail. Cependant, je doute que vous battez le moteur de regex sans aller à c et optimiser cela.


3 commentaires

"À quelle vitesse?" - Au moins plus vite que la méthode de chaînage de remplacement ci-dessus. "Quelle taille" - jusqu'à ce que la RAM System permet à la «fonction» de la RAM minimum. Je ne parle pas de gigantesque chaîne de taille 4GIB.


Basé sur mon expérience avec une taille de 3,5 m d'une chaîne avec 5 paires de substitution, la méthode d'expression régulière toujours est pire (1,285878 sec contre 1,3414442 sec), même avec la mise en cache de l'objet Re résultant. Si j'augmente le nombre de paires de substitution, la situation pourrait être inversée. Mais sous condition normale, cela n'arrive pas. Donc, la méthode d'expression régulière linéaire dans la recette dans ce cas n'est pas utilisable. Mes tests étaient againts une version plus efficace de celui-ci, en fait.


Oui, cette méthode n'est pas si grande. Avec une chance, nous verrons une meilleure réponse bientôt. Sinon, je peux voir si la mise en œuvre d'une machine d'état en haut de l'interface tampon Python fonctionne mieux.



6
votes

quelque chose comme ce qui suit peut-être? Diviser le texte en morceaux avec le premier élément "de" à remplacer, puis diviser récursivement chacune de ces pièces en sous-pièces avec le prochain élément "de" à remplacer, etc. jusqu'à ce que vous avez visité tous vos remplacements . Puis rejoignez-le avec l'élément de remplacement "à" pour chacun comme fonction reconsive terminée.

Un peu difficile à envelopper votre tête autour du code suivant peut-être (c'était pour moi, et je l'ai écrit), mais cela semble fonctionner comme prévu . Je ne l'ai pas repoussé, mais je soupçonne que ce serait raisonnablement rapide. xxx

pour: xxx


1 commentaires

Matt, merci pour la fonction. Il bat de plusieurs "remplacer" méthode sur une grande chaîne :) 'Remplacer' La méthode est toujours plus rapide sur une chaîne plus petite (chaîne <1m ou ainsi). J'ai ajouté mes résultats de test à ma question initiale. Vous voudrez peut-être vérifier.



1
votes

normalement, .replace méthode bat toutes les autres méthodes. (Voir mes repères ci-dessus.)


0 commentaires