Ось мій сценарій Perl та Python, щоб виконати просту обробку тексту з приблизно 21 файлу журналу, кожен приблизно від 300 КБ до 1 МБ (максимум) x 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.
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
Спочатку на цю просту обробку тексту потрібно було 10,2 секунди за допомогою Python і лише 1,9 секунди за допомогою Perl.
(UPDATE), але після скомпільованої re
версії Python тепер це займає 8,2 секунди в Python і 1,5 секунди в Perl. Все ж Perl набагато швидший.
Чи є спосіб взагалі покращити швидкість Python АБО очевидно, що Perl буде швидким для простої обробки тексту.
До речі, це був не єдиний тест, який я робив для простої обробки тексту ... І, по-різному, як я роблю вихідний код, Perl завжди завжди виграє з великим відривом. І жодного разу Python не виступав ефективніше для простого m/regex/
збігу та друку.
Будь ласка, не пропонуйте використовувати C, C ++, Assembly, інші смаки Python тощо.
Я шукаю рішення із використанням стандартного Python із вбудованими модулями порівняно зі стандартним Perl (навіть не використовуючи модулі). Хлопче, я хочу використовувати Python для всіх своїх завдань завдяки його читабельності, але, щоб відмовитись від швидкості, я не думаю.
Тож, будь ласка, підкажіть, як можна вдосконалити код, щоб отримати порівнянні результати з Perl.
ОНОВЛЕННЯ: 18.10.2012
Як припускали інші користувачі, Perl має своє місце, а Python - своє.
Отже, для цього питання можна впевнено зробити висновок, що для простого збігу регулярних виразів у кожному рядку для сотень або тисяч текстових файлів та запису результатів у файл (або друку на екран) Perl завжди, завжди ПЕРЕМОЖЕ у виконанні цієї роботи . Це так просто.
Зверніть увагу, що коли я кажу, що Perl виграє у продуктивності ... порівнюються лише стандартні Perl і Python ... не вдаючись до деяких незрозумілих модулів (незрозумілих для звичайного користувача, як я), а також не викликаючи C, C ++, бібліотеки збірки з Python або Perl. У нас немає часу, щоб вивчити всі ці додаткові кроки та встановлення для простої роботи зі збору тексту.
Отже, Perl скелі для обробки тексту та регулярних виразів.
Python має своє місце для розгойдування в інших місцях.
Оновлення 2013-05-29: відмінна стаття , яка робить таке порівняння тут . Perl знову виграє за просте узгодження тексту ... А для деталей прочитайте статтю.