Hier ist mein Perl- und Python-Skript für eine einfache Textverarbeitung aus ungefähr 21 Protokolldateien mit jeweils ungefähr 300 KB bis 1 MB (maximal) x 5-mal wiederholt (insgesamt 125 Dateien, da das Protokoll 5-mal wiederholt wurde).
Python-Code (Code geändert, um kompiliert re
und verwendet zu werden re.I
)
#!/usr/bin/python
import re
import fileinput
exists_re = re.compile(r'^(.*?) INFO.*Such a record already exists', re.I)
location_re = re.compile(r'^AwbLocation (.*?) insert into', re.I)
for line in fileinput.input():
fn = fileinput.filename()
currline = line.rstrip()
mprev = exists_re.search(currline)
if(mprev):
xlogtime = mprev.group(1)
mcurr = location_re.search(currline)
if(mcurr):
print fn, xlogtime, mcurr.group(1)
Perl Code
#!/usr/bin/perl
while (<>) {
chomp;
if (m/^(.*?) INFO.*Such a record already exists/i) {
$xlogtime = $1;
}
if (m/^AwbLocation (.*?) insert into/i) {
print "$ARGV $xlogtime $1\n";
}
}
Und auf meinem PC generiert jeder Code genau die gleiche Ergebnisdatei mit 10.790 Zeilen. Und hier ist das Timing für Cygwins Perl- und Python-Implementierungen.
User@UserHP /cygdrive/d/tmp/Clipboard
# time /tmp/scripts/python/afs/process_file.py *log* *log* *log* *log* *log* >
summarypy.log
real 0m8.185s
user 0m8.018s
sys 0m0.092s
User@UserHP /cygdrive/d/tmp/Clipboard
# time /tmp/scripts/python/afs/process_file.pl *log* *log* *log* *log* *log* >
summarypl.log
real 0m1.481s
user 0m1.294s
sys 0m0.124s
Ursprünglich dauerte es mit Python 10,2 Sekunden und mit Perl nur 1,9 Sekunden für diese einfache Textverarbeitung.
(UPDATE), aber nach der kompilierten re
Version von Python dauert es jetzt 8,2 Sekunden in Python und 1,5 Sekunden in Perl. Trotzdem ist Perl viel schneller.
Gibt es eine Möglichkeit, die Geschwindigkeit von Python überhaupt zu verbessern, ODER es ist offensichtlich, dass Perl die schnelle für die einfache Textverarbeitung sein wird.
Übrigens war dies nicht der einzige Test, den ich für die einfache Textverarbeitung durchgeführt habe ... Und auf jede andere Art und Weise, wie ich den Quellcode erstelle, gewinnt Perl immer mit großem Vorsprung. Und nicht ein einziges Mal schnitt Python besser ab, wenn es um einfache m/regex/
Übereinstimmungen und Drucke ging.
Bitte schlagen Sie nicht vor, C, C ++, Assembly, andere Python-Varianten usw. zu verwenden.
Ich suche nach einer Lösung mit Standard Python mit seinen eingebauten Modulen im Vergleich zu Standard Perl (nicht einmal mit den Modulen). Junge, ich möchte Python aufgrund seiner Lesbarkeit für alle meine Aufgaben verwenden, aber um die Geschwindigkeit aufzugeben, glaube ich nicht.
Schlagen Sie daher vor, wie der Code verbessert werden kann, um vergleichbare Ergebnisse mit Perl zu erzielen.
UPDATE: 18.10.2012
Wie andere Benutzer vorgeschlagen haben, hat Perl seinen Platz und Python seinen.
Bei dieser Frage kann man also mit Sicherheit den Schluss ziehen, dass Perl für eine einfache Regex-Übereinstimmung in jeder Zeile für Hunderte oder Tausende von Textdateien und das Schreiben der Ergebnisse in eine Datei (oder das Drucken auf dem Bildschirm) immer, immer die Leistung für diesen Job GEWINNT . So einfach ist das.
Bitte beachten Sie, dass, wenn ich sage, dass Perl an Leistung gewinnt ... nur Standard-Perl und Python verglichen werden ... nicht auf einige obskure Module zurückgegriffen wird (obskur für einen normalen Benutzer wie mich) und auch keine C-, C ++ - Assembly-Bibliotheken aus Python aufgerufen werden oder Perl. Wir haben keine Zeit, all diese zusätzlichen Schritte und die Installation für einen einfachen Textabgleich zu lernen.
Perl rockt also für Textverarbeitung und Regex.
Python hat seinen Platz, um an anderen Orten zu rocken.
Update 29.05.2013: Ein ausgezeichneter Artikel, der ähnliche Vergleiche anstellt , ist hier . Perl gewinnt erneut für den einfachen Textabgleich ... Und für weitere Details lesen Sie den Artikel.