h1

Benchmark regular Expressions

Oktober 31, 2008

Da 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.

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: