
Benchmark regular Expressions
Oktober 31, 2008Da ich schon vor kurzem einen Artikel über das Filtern von Text nach E-Mailadressen mithilfe von awk geschrieben habe, sind Charly und ich auf die Idee gekommen, zu vergleichen, welche Sprache oder welches Tool denn nun besser mit regulären Ausdrücken klarkommt. Dazu haben wir als Testobjekt eine Textdatei mit 720950 Zeilen genommen und haben mithilfe von regulären Ausdrücken alle E-Mailadressen aus der Datei gefiltert. Den Test haben wir mit awk, grep, Python und Perl durchgeführt.
Der Pythoncode:
#!/usr/bin/python # Reads all lines from a file, validates email adresses # as fast as it can import re file = open('sales10.txt') pattern = re.compile('[-_.a-zA-Z0-9]*@[-a-zA-Z0-9]*\.[a-zA-Z]{2,9}') for line in file.readlines(): if(pattern.search(line)): pass;
Der grep-Befehl:
grep -c '[-_.a-zA-Z0-9]*@[-a-zA-Z0-9]*\.[a-zA-Z]\{2,9\}' sales10.txt
Damit grep nicht unötig lange ausgaben macht, die das Ergebnis erheblich verfälschen würden, verwende ich die Option -c, die nur am Ende die Anzahl der übereinstimmenden Zeilen ausgibt.
Das awk-Script:
{ if ($0 ~ /[a-zA-Z\-_0-9\.]*@[a-zA-Z\-0-9]*\.[a-zA-Z]{2,9}/ ) { } }
Das Perlscript:
#!/usr/bin/perl -w use strict; while (<>) { if ( /[-_.a-zA-Z0-9]*@[-a-zA-Z0-9]*\.[a-zA-Z]{2,9}/ ) { } }
Hier die Ergebnisse:
awk: 0m15.353s – 0m15.380s – 0m15.245s
Python: 0m5.091s – 0m4.986s – 0m4.994s
grep: 0m0.633s – 0m0.639s – 0m0.630s
Perl: 0m0.494s – 0m0.492s – 0m0.512s
Die Ergebnisse wurde mit dem Bashbefehl time ermittelt und sind von der schlechtesten zur besten Zeit sortiert. Erstaunlich ist vor allem, das grep nicht die besten Zeiten hat, obwohl es genau auf diese Aufgabe spezialisiert ist.
