Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Perl  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9372
Аnостроф
Насчет "на порядки" - это ты загнул :)

по тестам разработчика компилируемой версии awk (а уж он свое детище не обидит) обходит интерпретируемый Perl в 1,5 - 2 раза.

http://awka.sourceforge.net/compare.html

Причем сравнения скорости регулярных выражений я так и не нашел.


На пару порядков на специфичных задачах.
Загибать привычки не имею, мы ем логи как то раз парсили. Сначала Perl-ом a потом awk.

По поводу скорости регулярок (а это не единственное отличие, влияющее на производительность)
почитай про DFA vs NFA (Хотя оно больше для простоты так называется ибо любое регулярное выражение можно привести к DFA (через NFA), а те регулярные выражения, что в Perl, они и не регулярные выражения вовсе, а нечто гораздо более мощное и гораздо менее теоретически обоснованное, для простоты называемое малограмотными людьми NFA движком регулярных выражений).

Блин, целый абзац написал Оно мне надо ваще тебя уговаривать ???
Возьми сравни и удивись. Если функционала awk хватит для твоей задачи, Perl по быстродействию рядом с ним стоять не будет (и мало кто еще к этому быстродействию приблизится)
29 апр 10, 16:44    [8709964]     Ответить | Цитировать Сообщить модератору
 Re: Perl  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9372
Аnостроф
можешь на awk составить программку, которая

прочитает файл 1.txt в своей директории
выполнит замену по шаблону s/\d+/123/g
и запишет результат в 2.txt
?

Хочу скорость сравнить :)


sed еще посмотри
а програмки за тебя писать у меня времени нет, уж звиняй
могу книжку по авку подкинуть
29 апр 10, 16:46    [8709995]     Ответить | Цитировать Сообщить модератору
 Re: Perl  [new]
Аnостроф
Member

Откуда:
Сообщений: 41
Кто-нибудь напишите на awk это прогу. На минуту делов-то. Вот на Perl:

open(IN, "1.txt");
open(OUT, ">2.txt");
while(<IN>){
s/\d+/123/g;
print OUT
}

А потом сравним скорость. Самому интересно.
29 апр 10, 17:01    [8710160]     Ответить | Цитировать Сообщить модератору
 Re: Perl  [new]
avb1003
Member

Откуда: Москва
Сообщений: 417
Аnостроф,
Если очень интересно, то рекомундую посмотреть
Дж.Фридл. "Регулярные выражения. Библиотека программиста" СПб.:Питер, 2001. c.147.
В главе 6 "Регулярные выражние в конкретных программах" есть раздел посвященный Awk и в нем
подраздел "Различия между диалектами регулярных выражений awk". Их, диалектов, там приведено 6.
Глава 7 посвящена регулярным выражениям в Perl. В Perl скорость работы с регулярными выражениями сильно зависит от выбора этих выражений - можно легко написать "плохое". В книге объясняется,
что к чему и как писать "хорошие". А сам язык, как таковой, вряд ли "на порядки" медленней. У меня был опыт - вдруг стала иногда(но сильно) тормозить С-ная программа - компонент системы 7x24, уже была в эксплуатации где-то около года. По-видимиму, администратор или другой нехороший человек подменил динамические библиотеки. Проблема решилась заменой регулярного выражения - не помню детали, где-то "убрал" "звездочку."
29 апр 10, 19:11    [8711052]     Ответить | Цитировать Сообщить модератору
 Re: Perl  [new]
Аnостроф
Member

Откуда:
Сообщений: 41
Спасибо, я неплохо разбираюсь в регулярных выражениях, так как написал по ним диссертацию :)
Человек уверяет, что awk при обработке текста работает "на порядок быстрее Perl". Мне интересно, действительно ли это так.
29 апр 10, 19:19    [8711077]     Ответить | Цитировать Сообщить модератору
 Re: Perl  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9372
Аnостроф
Спасибо, я неплохо разбираюсь в регулярных выражениях, так как написал по ним диссертацию :)
Человек уверяет, что awk при обработке текста работает "на порядок быстрее Perl". Мне интересно, действительно ли это так.


Интересно - проверь (я для себя уже проверил).
За тебя это делать не собираюсь

Коль диссер написл, должен понимать почему в Perl-е регулярные выражения далеко не так быстры как могли быть (не будь в них многих вкусностей)
30 апр 10, 08:44    [8712341]     Ответить | Цитировать Сообщить модератору
 Re: Perl  [new]
Аnостроф
Member

Откуда:
Сообщений: 41
А, так AWK используются DFA :( Ни обратных ссылок, ни утверждений. Для моих задач совсем не подходит, т.к. юзаю по-полной все возможности NFA и даже пишу по вечерам свою версию PCRE :) Работать движок будет помедленней, чем PCRE, но там будет куча вкусностей, облегчающих написания рег. выражений. Например, можно будет напрямую прописывать в шаблоне числа - скажем, "больше 40, но меньше 270".
30 апр 10, 10:00    [8712688]     Ответить | Цитировать Сообщить модератору
 Re: Perl  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9372
Аnостроф
А, так AWK используются DFA :( Ни обратных ссылок, ни утверждений. Для моих задач совсем не подходит, т.к. юзаю по-полной все возможности NFA и даже пишу по вечерам свою версию PCRE :) Работать движок будет помедленней, чем PCRE, но там будет куча вкусностей, облегчающих написания рег. выражений. Например, можно будет напрямую прописывать в шаблоне числа - скажем, "больше 40, но меньше 270".


Опять же, стоит определиться, что важнее: быстро или вкусности
Нам вкусностей хватало, а вот быстро было очень актуально
30 апр 10, 10:24    [8712853]     Ответить | Цитировать Сообщить модератору
 Re: Perl  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9372
Аnостроф
Например, можно будет напрямую прописывать в шаблоне числа - скажем, "больше 40, но меньше 270".


Гмм. В Perl-е можно довычислять выражение по ходу его выполнения. Мозг при этом правда выкипает да и вкусность какая-то шибко инопланетная, но ты уверен, что не изобретаешь велосипед ?
30 апр 10, 10:26    [8712875]     Ответить | Цитировать Сообщить модератору
 Re: Perl  [new]
Аnостроф
Member

Откуда:
Сообщений: 41
Gluk (Kazan), уверен. Сейчас, чтобы определять и сравнивать числа (не одиночные символы-цифры, а именно числа) внутри регулярных выражений приходится такой код наворачивать, что написание каждой такой регулярки превращаются в нетривиальную задачку даже для неслабых умов. А, между тем, дело это очень даже востребовано.
Еще одна фишка - оптимизация работы с пакетами регулярных выражений. Я обнаружил что длинное регулярное NFA-выражение с кучей условий, альтернациями, классами символов и т.п. работает гораздо медленней, чем аналогичный по действию пакет коротких регулярных выражений. В некоторых ситуациях разница доходит до 10 - 15 раз! Чем длиннее и сложнее регулярное выражение, тем эффективней с ним работает мой движок по сравнению с PCRE. Однако пока я погряз в отладке и оптимизации - даже не знаю, когда будет полноценная бета, которую будет не стыдно людям показать.
30 апр 10, 11:09    [8713348]     Ответить | Цитировать Сообщить модератору
 Re: Perl  [new]
Аnостроф
Member

Откуда:
Сообщений: 41
На коротких шаблонах PCRE пока быстрее на 20-30 % за счет того, что у меня движок более высокоуровневый.
30 апр 10, 11:15    [8713394]     Ответить | Цитировать Сообщить модератору
 Re: Perl  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9372
Аnостроф
На коротких шаблонах PCRE пока быстрее на 20-30 % за счет того, что у меня движок более высокоуровневый.


Наверное стоит посмотреть на движок TCL по поводу оптимизаций.
Не впоне понимаю как будет выглядеть регулярка для чисел. Примерчик можно?
30 апр 10, 11:29    [8713550]     Ответить | Цитировать Сообщить модератору
 Re: Perl  [new]
Аnостроф
Member

Откуда:
Сообщений: 41
TCL использует комбинированный движок NFA-DFA, но скорость не впечатлила.
30 апр 10, 11:49    [8713757]     Ответить | Цитировать Сообщить модератору
 Re: Perl  [new]
Аnостроф
Member

Откуда:
Сообщений: 41
Пример: удалить из строки числа, которые больше 23

s/ (\d:>23) / /g

Пример: найти в строке числа, которые больше переменной $a на 100, но меньше переменной $b

/(\d:>$a+1, <$b)/g
30 апр 10, 11:55    [8713820]     Ответить | Цитировать Сообщить модератору
 Re: Perl  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9372
Аnостроф
Пример: удалить из строки числа, которые больше 23

s/ (\d:>23) / /g

Пример: найти в строке числа, которые больше переменной $a на 100, но меньше переменной $b

/(\d:>$a+1, <$b)/g


надо вводить какие то скобки наподобие фигурных для квантификаторов.
Иначе каша получится и будет совсем не PCRE (особенно в последнем примере)
Кстати, числа это все таки \d+, а не \d
30 апр 10, 12:11    [8713978]     Ответить | Цитировать Сообщить модератору
 Re: Perl  [new]
Аnостроф
Member

Откуда:
Сообщений: 41
Пакеты на данный момент записываются в стиле Perl:

/regex1/ &&
/regex2/ &&
!/regex3/ &&
!/regex4/

т.е. если в строке ЕСТЬ regex1 и regex2, НО НЕТ regex3 и regex4, то пакет нашел совпадение. С помощью таких пакетов можно очень быстро писать сложнейшие условия для отлова строк, причем пакет будет работать в 10 - 15 раз быстрее, чем одно длинное NFA-регулярное выражение с использованием утверждений и прочих расширенных конструкций. Самое сложное - правильно реализовать возвращение найденных в пакете захваченных переменных.
30 апр 10, 12:12    [8713990]     Ответить | Цитировать Сообщить модератору
 Re: Perl  [new]
Аnостроф
Member

Откуда:
Сообщений: 41
"Надо вводить какие то скобки наподобие фигурных для квантификаторов" - это был самый первый вариант, который попробовал. Но с ним есть определенные трудности.

"Иначе каша получится и будет совсем не PCRE". При разбиении регулярных выражений на пакеты они выглядят очень понятно и легко записываются. Ладно, что-то я совсем выбился из рабочей колеи :)
30 апр 10, 12:17    [8714045]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Perl  [new]
volodin661
Member

Откуда: Внутренняя Монголия
Сообщений: 445
Аnостроф
Пример: удалить из строки числа, которые больше 23

s/ (\d:>23) / /g

Пример: найти в строке числа, которые больше переменной $a на 100, но меньше переменной $b

/(\d:>$a+1, <$b)/g




#удалить из строки числа, которые больше 23
s/ (\d+) / $1 if $1 <= 23 /ex

#найти в строке числа, которые больше переменной $a на 100, но меньше переменной $b
grep { $_-100 > $a and $_ < $b }  m/ ( \d+ ) /gx


ой-ой, закипели мозги.
29 ноя 13, 07:10    [15209465]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Perl  [new]
volodin661
Member

Откуда: Внутренняя Монголия
Сообщений: 445
Аnостроф

даже пишу по вечерам свою версию PCRE :) Работать движок будет помедленней, чем PCRE, но там будет куча вкусностей, облегчающих написания рег. выражений. Например, можно будет напрямую прописывать в шаблоне числа - скажем, "больше 40, но меньше 270".

Пример: удалить из строки числа, которые больше 23

s/ (\d:>23) / /g




Хочу отметить, что Larry Wall таки прислушался к идеям Апострофа :-) и реализовал их в своём новом regex engine в языке Perl6

удалить из строки числа, которые больше 23 :

s:g /(\d+) { $0 > 23 or next }//
25 сен 19, 18:18    [21979198]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Программирование Ответить