Schnellste Implementierung für mehrere String-Substitutionen in Python

8

Gibt es eine empfohlene Möglichkeit, mehrere String-Ersetzungen durchzuführen, anstatt die Kette auf einer Zeichenfolge zu ersetzen (zB text.replace (a, b) .replace (c, d) .replace (e, f) ...) ) Wie würden Sie zum Beispiel eine schnelle Funktion implementieren, die sich wie PHP's htmlspecialchars in Python verhält?

Ich verglich (1) mehrere Methoden zum Ersetzen, (2) die Methode für reguläre Ausdrücke und (3) die Methode von Matt Anderson.

Bei n = 10 Läufen kamen die Ergebnisse wie folgt zustande:

An 100 Zeichen:

%Vor%

Bei 1000 Zeichen:

%Vor%

Bei 10000 Zeichen:

%Vor%

An 100000 Zeichen:

%Vor%

Bei 1000000 Zeichen:

%Vor%

An 3687809 Zeichen:

%Vor%

Also ein großes Lob an Matt, dass er die Multi-Replace-Methode bei einer ziemlich großen Eingabezeichenfolge bezwungen hat.

Hat jemand Ideen, um es auf einer kleineren Saite zu schlagen?

    
OTZ 05.08.2010, 00:54
quelle

3 Antworten

0

Normalerweise schlägt die .replace-Methode alle anderen Methoden. (Siehe meine obigen Benchmarks.)

    
OTZ 30.08.2010, 10:14
quelle
3

Vielleicht so etwas wie folgt? Teilen Sie den Text in Teile mit dem ersten "von" zu ersetzenden Element auf, und teilen Sie dann jeden dieser Teile rekursiv in Unterteile mit dem nächsten "von" zu ersetzenden Element usw. ab, bis Sie alle Ihre Ersetzungen besucht haben . Fügen Sie dann mit dem Ersetzungselement "to" für jedes Element hinzu, wenn die rekursive Funktion abgeschlossen ist.

Ein wenig schwer, den folgenden Code vielleicht um den folgenden Code zu wickeln (es war für mich, und ich schrieb es), aber es scheint zu funktionieren wie beabsichtigt. Ich habe es nicht benchmarkiert, aber ich vermute, es wäre ziemlich schnell.

%Vor%

für:

%Vor%     
Matt Anderson 05.08.2010 05:26
quelle
0

Wie schnell? Wie groß sind deine Saiten?

Es gibt ein ziemlich einfaches Rezept zum Erstellen eines regulären Ausdrucks, um die Aufgabe zu erledigen auf einer anderen Seite. Es muss möglicherweise etwas optimiert werden, um Regex-Metazeichen zu verarbeiten. Ich habe nicht genau hingesehen.

Wenn das nicht gut genug ist, müssen Sie wahrscheinlich etwas C-Code schreiben, ehrlich gesagt. Sie können eine einfache Statusmaschine erstellen, um alle Ersetzungen durchzuführen, und dann jede Byte-byte-Folge ohne Backtracking entlang der Maschine verarbeiten, um die Arbeit tatsächlich zu erledigen. Ich bezweifle jedoch, dass Sie die Regex-Engine schlagen werden, ohne zu C zu wechseln und das zu optimieren.

    
Walter Mundt 05.08.2010 01:02
quelle

Tags und Links