Processamento de texto - desempenho Python vs Perl [closed]

Aqui está meu script Perl e Python para fazer um processamento de texto simples de cerca de 21 arquivos de log, cada um com cerca de 300 KB a 1 MB (máximo) x 5 vezes repetido (total de 125 arquivos, devido àregistro repetido 5 vezes).

Código Python (código modificado para usar compiladore e usandore.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)

Código Perl

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

E, no meu PC, o código gera exatamente o mesmo arquivo de resultado de 10.790 linhas. E, aqui está o timing feito nas implementações Perl e Python do Cygwin.

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

Originalmente, demorou 10,2 segundos usando Python e apenas 1,9 segundos usando Perl para este processamento de texto simples.

(UPDATE) mas, depois da compilaçãore versão do Python, agora leva 8,2 segundos em Python e 1,5 segundos em Perl. Ainda Perl é muito mais rápido.

Existe uma maneira de melhorar a velocidade do Python? Ou é óbvio que o Perl será o mais veloz para o processamento de texto simples.

A propósito, este não foi o único teste que fiz para processamento de texto simples ... E, de cada maneira diferente, eu faço o código-fonte, sempre sempre Perl ganha por uma grande margem. E, nem uma vez, o Python funcionou melhor para simplesm/regex/ combinar e imprimir coisas.

Por favor, não sugira usar C, C ++, Assembly, outros sabores do Python, etc.

Eu estou procurando uma solução usando o Standard Python com seus módulos internos comparados com o Standard Perl (nem mesmo usando os módulos). Rapaz, eu gostaria de usar Python para todas as minhas tarefas devido à sua legibilidade, mas para desistir da velocidade, eu não penso assim.

Então, por favor, sugira como o código pode ser melhorado para ter resultados comparáveis ​​com o Perl.

ATUALIZAÇÃO: 2012-10-18

Como outros usuários sugeriram, o Perl tem seu lugar e o Python tem o seu.

Portanto, para essa questão, pode-se concluir com segurança que, para uma correspondência simples de regex em cada linha, para centenas ou milhares de arquivos de texto, e gravar os resultados em um arquivo (ou imprimir na tela),Perl sempre, sempre ganha em desempenho para este trabalho. É tão simples assim.

Por favor, note que quando eu digo que Perl vence em performance ... apenas Perl padrão e Python são comparados ... não recorrendo a alguns módulos obscuros (obscuros para um usuário normal como eu) e também não chamando C, C ++, bibliotecas assembly do Python ou Perl. Não temos tempo para aprender todas essas etapas extras e instalação para um trabalho de correspondência de texto simples.

Então, o Perl balança para processamento de texto e regex.

Python tem o seu lugar para rock em outros lugares.

Atualização 2013-05-29: Um excelente artigo que faz comparação semelhanteé aqui. Perl novamente ganha por correspondência de texto simples ... E para mais detalhes, leia o artigo.

questionAnswers(5)

yourAnswerToTheQuestion