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.
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
).
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.
std::function
übergeben, wird der C ++ - Code langsamer; std::smatch
match; in jeder Iteration; Ich frage mich auch, mit welcher Optimierung Sie arbeiten.
Die Funktion run()
macht zu viel. Repariere das. :)
Tags und Links python regex c++11 performance visual-studio-2013