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.