Przetwarzanie tekstu - wydajność Pythona vs Perla [zamknięte]

Oto mój skrypt Perla i Pythona do prostego przetwarzania tekstu z około 21 plików dziennika, z których każdy około 300 KB do 1 MB (maksymalnie) x 5 razy powtarzany (łącznie 125 plików, ze względu nalog powtórzone 5 razy).

Kod Pythona (kod zmodyfikowany do użycia skompilowanyre i używaniere.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)

Kod Perla

#!/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";
    }
}

I na moim komputerze oba kody generują dokładnie ten sam plik wynikowy o długości 10 790 linii. Oto czas wykonania implementacji Cygwina w Perlu i Pythonie.

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

Początkowo zajęło 10,2 sekundy przy użyciu Pythona i tylko 1,9 sekundy przy użyciu Perla do tego prostego przetwarzania tekstu.

(UPDATE), ale po skompilowaniure wersja Pythona, teraz zajmuje 8,2 sekundy w Pythonie i 1,5 sekundy w Perlu. Nadal Perl jest znacznie szybszy.

Czy w ogóle istnieje sposób na zwiększenie szybkości Pythona LUB oczywiste jest, że Perl będzie szybkim narzędziem do prostego przetwarzania tekstu.

Przy okazji, nie był to jedyny test, który wykonałem dla prostego przetwarzania tekstu ... I, w inny sposób, jak robię kod źródłowy, zawsze zawsze wygrywa Perl z dużym marginesem. I nie raz Python działał lepiej dla prostotym/regex/ dopasuj i wydrukuj rzeczy.

Nie sugeruj używania C, C ++, Assembly, innych smaków Pythona itp.

Szukam rozwiązania przy użyciu standardowego Pythona z wbudowanymi modułami w porównaniu ze standardowym Perlem (nawet przy użyciu modułów). Chłopcze, chcę używać Pythona do wszystkich moich zadań ze względu na jego czytelność, ale żeby zrezygnować z szybkości, nie sądzę.

Sugeruj więc, w jaki sposób można poprawić kod, aby uzyskać porównywalne wyniki z Perlem.

AKTUALIZACJA: 2012-10-18

Jak sugerowali inni użytkownicy, Perl ma swoje miejsce i Python ma swoje.

Więc dla tego pytania można bezpiecznie dojść do wniosku, że dla prostego dopasowania wyrażenia regularnego w każdej linii dla setek lub tysięcy plików tekstowych i zapisania wyników do pliku (lub drukowania na ekranie),Perl zawsze będzie wygrywał wydajność dla tego zadania. To takie proste.

Zwróć uwagę, że kiedy mówię, że Perl wygrywa w wydajności ... tylko standardowy Perl i Python jest porównywany ... nie uciekając się do niejasnych modułów (niejasnych dla zwykłego użytkownika, takich jak ja), a także nie wywołując C, C ++, bibliotek montażowych z Pythona lub Perl. Nie mamy czasu, aby nauczyć się wszystkich tych dodatkowych kroków i instalacji w celu prostego dopasowania tekstu.

Tak więc Perl używa do przetwarzania tekstu i wyrażeń regularnych.

Python ma swoje miejsce do rocka w innych miejscach.

Aktualizacja 2013-05-29: Doskonały artykuł, który robi podobne porównaniejest tutaj. Perl ponownie wygrywa w przypadku prostego dopasowywania tekstu ... Aby uzyskać więcej informacji, przeczytaj artykuł.

questionAnswers(5)

yourAnswerToTheQuestion