Regex-Geschwindigkeit: Python x6 mal schneller als C ++ 11 unter VS2013?

9

Könnte es sein, dass Pythons C-Regex-Implementierung 6 mal schneller ist oder fehlt mir etwas?

Python-Version:

%Vor%

C ++ 11 Version:

%Vor%

Bearbeiten: Hier ist der Code für bench_utils:

%Vor%     
GabiMe 26.02.2014, 07:18
quelle

2 Antworten

4

Das erste, was zu beachten ist, dass in Python Regex (ob mit dem Modul re oder regex ) 'mit der Geschwindigkeit von c' ausgeführt wird, das heißt, der eigentliche Code zum schweren Heben ist kalt hart c und Daher hängt die Leistung zumindest für längere Strings von der Implementierung von c regexp ab.

Manchmal ist Python ziemlich clever, Python hat keine Probleme in der Umgebung von mehreren Millionen Operationen pro Sekunde und kann Millionen von Objekten pro Sekunde erzeugen - das ist tausendmal langsamer als c, aber wenn wir reden etwas, das in Mikrosekunden beginnt, der Python-Overhead spielt vielleicht keine Rolle, er fügt jedem Funktionsaufruf nur 0,1 Mikrosekunden hinzu.

In diesem Fall spielt die relative Langsamkeit von Python keine Rolle. Es ist schnell genug in absoluten Zahlen, dass es darauf ankommt, wie schnell die regulären Ausdrücke ihr Ding machen.

Ich habe den C ++ - Fall so umgeschrieben, dass er keiner Kritik mehr unterliegt (ich hoffe, ich kann Sie darauf hinweisen), er muss nicht einmal ein Match-Objekt erstellen, da die Suche einfach ein Bool zurückgibt (true / false) ):

%Vor%

Ich habe ein vergleichbares Python-Programm geschrieben (obwohl Python ein Match-Objekt erstellt und zurückgegeben hat) und meine Ergebnisse waren genau die gleichen wie Ihre

%Vor%

Ich denke, die grundlegende Schlussfolgerung hier ist, dass Pythons Regex-Implementierung einfach die C ++ - Standardbibliothek umgeht.

Es drängt Go auch

Vor einiger Zeit habe ich Pythons Regex-Leistung mit Go's Regex-Leistung verglichen. Und Python war mindestens doppelt so schnell.

Die Schlussfolgerung ist, dass die Regexp-Implementierung von Python sehr gut ist und Sie sollten sich nicht außerhalb von Python umsehen, um eine verbesserte Regexp-Leistung zu erhalten. Der reguläre Ausdruck der Arbeit ist im Grunde zeitaufwendig genug, dass Pythons Aufwand nicht wirklich von Bedeutung ist und Python eine großartige Implementierung hat (und das neue Modul regex ist oft sogar schneller als re ).

    
Blake Walsh 07.10.2014 09:34
quelle
0

Die Verwendung von timeit für Benchmarks ist falsch, da es Ihnen das Beste von 3 und keinen statistischen Differenztest gibt.

Es ist Ihr Code, nicht die Sprache.

  1. Wenn Sie die Funktion als std::function übergeben, wird der C ++ - Code langsamer;
  2. Aufruf von Uhrfunktionen in jeder Iteration;
  3. Erstellen neuer Objekte, z. B. std::smatch match; in jeder Iteration;
  4. Die Lauffunktion;
  5. Vorkompilierung der Regex nicht möglich.

Ich frage mich auch, mit welcher Optimierung Sie arbeiten.

Die Funktion run() macht zu viel. Repariere das. :)

    
Good Person 18.05.2014 17:09
quelle