powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Perl
19 сообщений из 44, страница 2 из 2
Perl
    #36605662
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АnострофНасчет "на порядки" - это ты загнул :)

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

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

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

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

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

Блин, целый абзац написал Оно мне надо ваще тебя уговаривать ???
Возьми сравни и удивись. Если функционала awk хватит для твоей задачи, Perl по быстродействию рядом с ним стоять не будет (и мало кто еще к этому быстродействию приблизится)
...
Рейтинг: 0 / 0
Perl
    #36605672
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аnострофможешь на awk составить программку, которая

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

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

sed еще посмотри
а програмки за тебя писать у меня времени нет, уж звиняй
могу книжку по авку подкинуть
...
Рейтинг: 0 / 0
Perl
    #36605711
Аnостроф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-нибудь напишите на awk это прогу. На минуту делов-то. Вот на Perl:

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

А потом сравним скорость. Самому интересно.
...
Рейтинг: 0 / 0
Perl
    #36606072
avb1003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аnостроф,
Если очень интересно, то рекомундую посмотреть
Дж.Фридл. "Регулярные выражения. Библиотека программиста" СПб.:Питер, 2001. c.147.
В главе 6 "Регулярные выражние в конкретных программах" есть раздел посвященный Awk и в нем
подраздел "Различия между диалектами регулярных выражений awk". Их, диалектов, там приведено 6.
Глава 7 посвящена регулярным выражениям в Perl. В Perl скорость работы с регулярными выражениями сильно зависит от выбора этих выражений - можно легко написать "плохое". В книге объясняется,
что к чему и как писать "хорошие". А сам язык, как таковой, вряд ли "на порядки" медленней. У меня был опыт - вдруг стала иногда(но сильно) тормозить С-ная программа - компонент системы 7x24, уже была в эксплуатации где-то около года. По-видимиму, администратор или другой нехороший человек подменил динамические библиотеки. Проблема решилась заменой регулярного выражения - не помню детали, где-то "убрал" "звездочку."
...
Рейтинг: 0 / 0
Perl
    #36606081
Аnостроф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, я неплохо разбираюсь в регулярных выражениях, так как написал по ним диссертацию :)
Человек уверяет, что awk при обработке текста работает "на порядок быстрее Perl". Мне интересно, действительно ли это так.
...
Рейтинг: 0 / 0
Perl
    #36606599
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АnострофСпасибо, я неплохо разбираюсь в регулярных выражениях, так как написал по ним диссертацию :)
Человек уверяет, что awk при обработке текста работает "на порядок быстрее Perl". Мне интересно, действительно ли это так.

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

Коль диссер написл, должен понимать почему в Perl-е регулярные выражения далеко не так быстры как могли быть (не будь в них многих вкусностей)
...
Рейтинг: 0 / 0
Perl
    #36606715
Аnостроф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, так AWK используются DFA :( Ни обратных ссылок, ни утверждений. Для моих задач совсем не подходит, т.к. юзаю по-полной все возможности NFA и даже пишу по вечерам свою версию PCRE :) Работать движок будет помедленней, чем PCRE, но там будет куча вкусностей, облегчающих написания рег. выражений. Например, можно будет напрямую прописывать в шаблоне числа - скажем, "больше 40, но меньше 270".
...
Рейтинг: 0 / 0
Perl
    #36606763
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АnострофА, так AWK используются DFA :( Ни обратных ссылок, ни утверждений. Для моих задач совсем не подходит, т.к. юзаю по-полной все возможности NFA и даже пишу по вечерам свою версию PCRE :) Работать движок будет помедленней, чем PCRE, но там будет куча вкусностей, облегчающих написания рег. выражений. Например, можно будет напрямую прописывать в шаблоне числа - скажем, "больше 40, но меньше 270".

Опять же, стоит определиться, что важнее: быстро или вкусности
Нам вкусностей хватало, а вот быстро было очень актуально
...
Рейтинг: 0 / 0
Perl
    #36606771
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АnострофНапример, можно будет напрямую прописывать в шаблоне числа - скажем, "больше 40, но меньше 270".

Гмм. В Perl-е можно довычислять выражение по ходу его выполнения. Мозг при этом правда выкипает да и вкусность какая-то шибко инопланетная, но ты уверен, что не изобретаешь велосипед ?
...
Рейтинг: 0 / 0
Perl
    #36606876
Аnостроф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan), уверен. Сейчас, чтобы определять и сравнивать числа (не одиночные символы-цифры, а именно числа) внутри регулярных выражений приходится такой код наворачивать, что написание каждой такой регулярки превращаются в нетривиальную задачку даже для неслабых умов. А, между тем, дело это очень даже востребовано.
Еще одна фишка - оптимизация работы с пакетами регулярных выражений. Я обнаружил что длинное регулярное NFA-выражение с кучей условий, альтернациями, классами символов и т.п. работает гораздо медленней, чем аналогичный по действию пакет коротких регулярных выражений. В некоторых ситуациях разница доходит до 10 - 15 раз! Чем длиннее и сложнее регулярное выражение, тем эффективней с ним работает мой движок по сравнению с PCRE. Однако пока я погряз в отладке и оптимизации - даже не знаю, когда будет полноценная бета, которую будет не стыдно людям показать.
...
Рейтинг: 0 / 0
Perl
    #36606887
Аnостроф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На коротких шаблонах PCRE пока быстрее на 20-30 % за счет того, что у меня движок более высокоуровневый.
...
Рейтинг: 0 / 0
Perl
    #36606920
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АnострофНа коротких шаблонах PCRE пока быстрее на 20-30 % за счет того, что у меня движок более высокоуровневый.

Наверное стоит посмотреть на движок TCL по поводу оптимизаций.
Не впоне понимаю как будет выглядеть регулярка для чисел. Примерчик можно?
...
Рейтинг: 0 / 0
Perl
    #36607009
Аnостроф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TCL использует комбинированный движок NFA-DFA, но скорость не впечатлила.
...
Рейтинг: 0 / 0
Perl
    #36607037
Аnостроф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример: удалить из строки числа, которые больше 23

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

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

/(\d:>$a+1, <$b)/g
...
Рейтинг: 0 / 0
Perl
    #36607095
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АnострофПример: удалить из строки числа, которые больше 23

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

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

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

надо вводить какие то скобки наподобие фигурных для квантификаторов.
Иначе каша получится и будет совсем не PCRE (особенно в последнем примере)
Кстати, числа это все таки \d+, а не \d
...
Рейтинг: 0 / 0
Perl
    #36607099
Аnостроф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пакеты на данный момент записываются в стиле Perl:

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

т.е. если в строке ЕСТЬ regex1 и regex2, НО НЕТ regex3 и regex4, то пакет нашел совпадение. С помощью таких пакетов можно очень быстро писать сложнейшие условия для отлова строк, причем пакет будет работать в 10 - 15 раз быстрее, чем одно длинное NFA-регулярное выражение с использованием утверждений и прочих расширенных конструкций. Самое сложное - правильно реализовать возвращение найденных в пакете захваченных переменных.
...
Рейтинг: 0 / 0
Perl
    #36607118
Аnостроф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Надо вводить какие то скобки наподобие фигурных для квантификаторов" - это был самый первый вариант, который попробовал. Но с ним есть определенные трудности.

"Иначе каша получится и будет совсем не PCRE". При разбиении регулярных выражений на пакеты они выглядят очень понятно и легко записываются. Ладно, что-то я совсем выбился из рабочей колеи :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Perl
    #38482802
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АnострофПример: удалить из строки числа, которые больше 23

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

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

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



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

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



ой-ой, закипели мозги.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Perl
    #39867045
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аnостроф
даже пишу по вечерам свою версию PCRE :) Работать движок будет помедленней, чем PCRE, но там будет куча вкусностей, облегчающих написания рег. выражений. Например, можно будет напрямую прописывать в шаблоне числа - скажем, "больше 40, но меньше 270".

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

Код: perl
1.
s/ (\d:>23) / /g





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

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

Код: perl
1.
s:g /(\d+) { $0 > 23 or next }//
...
Рейтинг: 0 / 0
19 сообщений из 44, страница 2 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Perl
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]