Вот мой perl и python script, чтобы сделать некоторую простую текстовую обработку из примерно 21 файла журнала каждый примерно от 300 КБ до 1 МБ (макс.) х 5 раз повторяется (всего 125 файлов, из-за журнала повторяется 5 раз).
Код Python (код изменен для использования скомпилированного re и с использованием 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
#!/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";
}
}
И на моем ПК оба кода генерируют точно такой же файл результата из 10 790 строк. И, вот сроки, сделанные на cygwin perl и python
[email protected] /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
[email protected] /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
Первоначально для этой простой обработки текста потребовалось 10,2 секунды с использованием Python и всего 1,9 секунды с использованием Perl.
(UPDATE), но после скомпилированной версии python теперь она занимает 8,2 секунды на python и 1,5 секунды в perl. Тем не менее perl намного быстрее.
В любом случае, чтобы улучшить скорость Python вообще ИЛИ, очевидно, что вы, ребята, ребята, что Perl будет быстродействующим для простой обработки текста.
Кстати, это был не единственный тест, который я сделал для простой обработки текста... И каждый раз, когда я делаю исходный код, всегда всегда Perl выигрывает с большим отрывом. И ни разу Python не работал лучше для простого m/regex/
совпадения и печати.
Спасибо за ваш вклад.
Пожалуйста, не предлагайте использовать C, С++, Assembly, другие варианты Python и т.д.
Я ищу решение с использованием стандартного Python с его встроенным модули по сравнению со стандартным Perl (даже не с использованием модулей). Мальчик, я хочу использовать Python для всех своих задач из-за его удобочитаемости, но чтобы отказаться от скорости, я так не думаю.
Итак, пожалуйста, предложите, как можно улучшить код, чтобы сопоставить результаты с perl.
ОБНОВЛЕНИЕ: 18OCT2012
Как и другие пользователи, Perl имеет свое место, а Python имеет свой.
Итак, для этого вопроса можно смело заключить, что для простого регулярного выражения в каждой строке для сотен или тысяч текстовых файлов и записи результатов в файл (или печать на экран), Perl всегда будет всегда WIN в производительности для этой работы, так же просто.
Обратите внимание, что когда я говорю, что Perl выигрывает в производительности, сравниваются только стандартные Perl и Python... не прибегая к некоторым неясным модулям (неясный для обычного пользователя, как я), а также не вызывающий C, С++, сборные библиотеки от python или perl. У нас нет времени, чтобы изучить все эти дополнительные шаги и установку для простого задания соответствия текста.
Итак, Perl-камни для обработки текста и регулярного выражения.
У Python есть место для катания в других местах.
Обновить 29May2013: Отличная статья, которая делает аналогичное сравнение здесь. Perl снова выигрывает для простого сопоставления текста.. и для более подробной информации читайте статью.