1. Куча / Говнокод #20415

    +3

    1. 1
    ^[\s\u200c]+|[\s\u200c]+$

    Стековерфло не могут в регулярные выражения или регулярные выражения не могут в простейшую задачу?
    http://stackstatus.net/post/147710624694/outage-postmortem-july-20-2016

    Запостил: kipar, 23 Июля 2016

    Комментарии (83) RSS

    • Поучительная история. Интересно, что мешает оптимизировать подобное?
      Ответить
      • Ну это оптимизатор регулярок, походу, какой-то тупой. После фейла на aaaaab он должен был не на aaaab откатываться, а пропустить всю эту хуйню и идти дальше.
        Ответить
        • Ну что и требовалось доказать. В пёрле регулярка a+$ на строке "aaaa<...20000 раз...>aaab" работает мгновенно, а в питоне - почти секунду.

          Питонобляди соснули.
          Ответить
          • Какой питон ? )))

            Питон 2.6:
            >>> t=timeit.default_timer(); re.compile('a+$').match('a'*2*1000*1000 + 'b'); timeit.default_timer() - t
            0.046612744743686818

            Жс на Chrome 51 (впрочем, в Firefox тоже тормозит):
            console.time('array'); Array(20000).join('a'); console.timeEnd('array');
            array: 0.159ms
            console.time('re'); (Array(20000).join('a')+'b').match(/a+$/); console.timeEnd('re');
            re: 516.424ms
            Ответить
            • Питоний match не будет бектрекать, он с начала строки матчит, аля /^hui/. search попробуй вместо него.
              Ответить
              • Ай, тьфу, питонопроблемы же. В жс интерфейс регулярочных методов проще гораздо, тут можно соснуть только если нарываешься на изменение состояния (lastIndex).
                Ответить
              • Ты крышку в регулярке в гк не заметил случайно?

                А нахуя match и search я давно интересовался. К этому теперь fullmatch добавили, хоть что-то полезное.
                Ответить
                • Там кроме крышки еще палочка.
                  Ответить
                • Так там крышка у левой половины or'а, а бакс - у правой. Или я неправильно читаю?
                  Ответить
                  • http://ideone.com/bJW6DR

                    А крышку с вопросиком низзя? И в чем великий сука смысл такой регулярки?
                    Ответить
                    • Нахуя search когда для замены есть sub? Я так понимаю, проблема в том, что дожил до популярности код написанный тогда когда хайлоадом еще не пахло.
                      Ответить
                      • Господи... Ты думаешь, что у sub нету этой проблемы?
                        r = re.compile("a+$")
                        r.search("a" * 20000 + "b")
                        res = r.sub("c", "a" * 20000 + "b")
                        По-твоему 1.5 секунды (!) на выполнение этой регулярки это норма?
                        Ответить
                        • Задача какая была, напомни? Убрать пробелы в начала и конце? Алсо, ты ебанулся 2 раза регекспы гонять?
                          Ответить
                          • > 2 раза регекспы гонять
                            А в чём проблема? Для того компиляция и сделана, чтобы несколько раз можно было запускать без повторного парсинга и построения автомата...

                            > Убрать пробелы в начала и конце?
                            Да знаю я, знаю, что для этого достаточно strip. Но вот если сделать это регуляркой - получаем лагалище с квадратичной сложностью (хотя в том же пёрле всё мгновенно отрабатывает).

                            З.Ы. Или тебе не нравится буква a вместо пробела? Как нахуй разница то? Или тебе не нравится, что я левую половину регулярки отбросил, чтобы не переусложнять пример (один хуй лагает)?
                            Ответить
                            • >А в чём проблема?
                              В том что это можно сделать за один раз? Причем тут компиляция, она ленивая.

                              >Но вот если сделать это регуляркой - получаем лагалище с квадратичной сложностью
                              Не, ну если еще черезжопнее сделать, то можно еще и экспоненту получить, а так re.sub(r"^[\s\u200c]+", "", str) + re.sub(r"[\s\u200c]+$", "", str)

                              Ты лагаешь прост.
                              Ответить
                              • > re.sub(r"[\s\u200c]+$", "", str)
                                Так эта хуйня и лагает:
                                str = "a" + " " * 20000 + "b"
                                res = re.sub(r"[\s\u200c]+$", "", str)
                                До тебя никак не дойдёт?
                                Ответить
                                • Я ниже спросил - где бектрекинг?

                                  re.sub("[\s\u200c]+$", "", " " + 'aaa' + ' '*20000)
                                  Тут ничего не лагает.
                                  Ответить
                                  • а в

                                    re.sub("[\s\u200c]+$", "", " " + 'aaa' + ' '*20000+'a')
                                    Ответить
                                  • > Тут ничего не лагает.
                                    А если перевернуть - лагает:
                                    res = re.sub("[\s\u200c]+$", "", " "*20000 + 'aaa' + ' ')
                                    Ответить
                            • >> один хуй лагает

                              Когда я лагал?
                              Ответить
    • бэктрекинг всегда был слегка отстоем. это отрезание пробелов конечно странный случай (я именно такого в перле делал тоннами - ни разу проблем не было) но в общем случае народ просто хочет рекурсивные/вложеные регулярки.
      Ответить
    • А где тут бектрекинг, объясните?
      Ответить
      • Кто-то автоминусатор влепил?
        Ответить
      • Нету там нихуя бектрекинга. Бектрекинг - это вроде (\S+\s)+ (повторяющееся слово).

        А не, нихуя. То бекреференс http://stackoverflow.com/questions/9011592/in-regular-expressions-what-is-a-backtracking-back-referencing
        Ответить
        • Пусть у нас есть регулярка "a+$" и мы её применяем к строке "aaaaab". "aaaaa" отлично матчится, но вместо конца строки мы видим "b". Тупой движок делает откат и пытается приладить регулярку к "aaaaab", она опять не подходит, и к "aaaaab", и к "aaaaab"... И до него только в самом конце доходит, что шаблон не сходится. Очевидно, что это даёт O(n^2) от длины строки.

          Не было бы бектрекинга, лагало бы оно так на жалких 20к символов?
          Ответить
    • А почему регулярки, которые заканчиваются $ и не начинаются с ^, не работают от конца?
      Ответить
      • Ну так эта регулярка как раз ведь с крышечки и начиналась.
        Ответить
        • Тоже верно.
          Ответить
        • Нихуя, крышечка в |. Я правильно понимаю, что в регулярках, матчащих всю строку только с одним + или * такое невозможно?
          Ответить
      • Потому что строго говоря так работает state-машина, которой являются регулярки. Кстати, регулярки зачастую применяют, чтобы выдрать информацию из потока, который по определению может двигаться только вперёд.

        А в данном случае — хреновый оптимизатор.
        Ответить
        • > state-машина
          Конечный автомат же, блжад!

          >хреновый оптимизатор
          Его просто нет.
          Ответить
          • > state-машина
            Конечный автомат же, блжад!

            >хреновый оптимизатор
            хреновый улучшатель же, блжад!
            Ответить
    • Короче, хуйня галимая ваши эти регулярки. Можно задосить. (l|r)strip() в данном случае правильнее.
      Ответить
      • Но в пёрле же не тормозят :3
        Ответить
        • А в перле почему не тормозят?
          Ответить
          • perl -e "use strict;$_='a'x20000 . 'b' ;print /a+$/;print $&

            Оно?
            Ответить
            • да. но только почти: в перле, многие тривиальные регулярки оптимизатор конвертит в вызовы обычных строковых функций. другими словами он за тебя вставляет strip или еще чего надо. мелочь но приятно.
              Ответить
              • Почему питон делает по-другому? Что он приобретает?
                Ответить
                • Покури мои сорцы
                  Ответить
                • в питоне - регулярки это внешняя либа, типа STL: да, с языком поставляется, но все равно внешняя либа.

                  в перле - регулярки часть синтаксиса языка, и структура регулярки (еще за долго до её компиляции) известна на стадии парсинга скрипта. на основе структуры можно уже и делать высокоуровневые оптимизации.

                  pcre тоже оптимизирует, и принижать то что народ там делает не стоит. но у перла все равно оптимизируется больше и глубже по простой причине - нужда. в языке функций для работы со строками просто кот наплакал. по дезайну все нужно делать регулярками. найти подстроку, вырезать подстроку, вставить подстроку, распарсить строку (sscanf/etc) - почти всегда приходится делать через регулярки, потому что альтернативы плачевны.
                  Ответить
                  • >и структура регулярки (еще за долго до её компиляции) известна на стадии парсинга скрипта.
                    С какого перепоя? Брать регексп из переменной перл не умеет что ли?

                    Никто ничего не принижает, просто питон ищет тщательнее, значит, это должно что-то приносить, иначе бы это выпилили к хуям собачим или запилили бы альтернативный модуль.
                    Ответить
                    • > С какого перепоя? Брать регексп из переменной перл не умеет что ли?

                      и из переменных он тоже умеет. но перл так же поддерживает интерполяцию переменных - включая qr// переменные - и подмешивание перлового кода в регулярках. что бы это сделать, приходится регулярки парсить вместе с остальным кодом.
                      Ответить
                      • Регекспы из переменных же недоступны на стадии парсинга скрипта.
                        Ответить
                  • > в языке функций для работы со строками просто кот наплакал

                    Подо мной уже лужа. Это всё, что я смог.
                    Ответить
    • Как выяснить, какая именно регулярка в коде тормозит? Можно прогнать профайлер, он покажет, какой вызов тормозит, но не покажет параметры.
      Ответить
      • Протестировать каждую?
        Если у тебя в коде их слишком много для тестирования каждой - это очень серьёзный повод задуматься.
        Ответить
      • профилируй регулярку саму
        regexpbuddy тебе в опмощь
        Ответить
        • И как он ее профилирует? Аналогично выхлопу питоновского re с параметром DEBUG?
          Ответить
          • Блядь
            Он автомат тирассирует
            Скачай да попробуй
            Ответить
            • Скриншот выложи. Неужто на оффсайте нет?
              Ответить
      • Сохранять полные параметры HTTP запроса в файл если страничка генерилась дольше чем обычно (мы же про веб-сервис?). Ну а потом хоть дебаггером - контрольный пример есть.
        Ответить
        • Лол, и как ты дебаггером время работы мерять собрался?
          Ответить
          • Я натяну тебя, пидараз.
            Ответить
          • Ну не знаю как в ваших питоновских IDE, но в той же визуал студии видно сколько времени прошло с последнего бряка.
            Ответить
            • >в ваших питоновских IDE
              /0.

              В студии можно померять интервал между двумя бряками (останавливаться на бряках естественно не надо)?
              Ответить
              • Х.з., не пробовал.
                Ответить
                • А что ты тогда до этого написал?
                  Ответить
                  • Что когда на бряке стоишь, показано сколько времени прошло со старта проги или с предыдущего бряка (ну и полное время работы, за вычетом пауз в отладчике).

                    Так что если пробежаться несколько раз (пример же у нас есть, можем сколько угодно его гонять) с run to cursor, вполне можно прикинуть, в каком районе лаг.
                    Ответить
                    • Но на бряке прога останавливается же. Время какое - процессорное или реальное, с учетом паузы программиста? Короче, скорее всего придется самому смотреть.

                      Но аналогов в путхоне имхо нет, да и гонять задолбешься. Разве что двоичным поиском.
                      Ответить
                      • Х.з., вроде реальное за вычетом пауз.

                        > Разве что двоичным поиском.
                        Ну я примерно так и искал лаг в нашем проекте. Довольно быстро нашлось. Так что вполне юзабельное время там показано.
                        Ответить
                        • Ну даже если - сколько языков эта хрень поддерживает? А для питона относительно нормальная иде только одна - pycharm, но мой говноут со свалки она превращает в первый пень.
                          Ответить
                          • Кресты да всякую дотнетчину. Вроде и всё.
                            Ответить
              • лол, сема профилировщик изобрел

                кстати, профайлеры есть и для пист0на, зачаточные
                Ответить
                • ███████                                                                                                                         
                  ██   ██                                                                                                                         
                  ██   ██                                                                                                                         
                  ██   ██  █████     ████ ██   ██ ██████  █████  ██████  ████        ██   ██  █████       ██   ██ ██   ██ ██ █ ██ ██   ██  ████   
                  ██   ██ ██   ██   ██ ██ ██   ██ █ ██ █ ██   ██ █ ██ █     ██       ██   ██ ██   ██      ██   ██ ██   ██ ██ █ ██ ██   ██     ██  
                  ██   ██ ██   ██  ██  ██ ██  ███   ██   ██   ██   ██    █████       ██   ██ ██   ██      ██   ██ ██   ██  █ █ █  ██   ██  █████  
                  ██   ██ ██   ██  ██  ██ ██ █ ██   ██   ██   ██   ██   ██  ██       ███████ ███████      ███████ ██   ██  █████  ███████ ██  ██  
                  ██   ██ ██   ██  ██  ██ ███  ██   ██   ██   ██   ██   ██  ██       ██   ██ ██           ██   ██ ██   ██  █ █ █  ██   ██ ██  ██  
                  ██   ██ ██   ██  ██  ██ ██   ██   ██   ██   ██   ██   ██  ██       ██   ██ ██   ██      ██   ██  ██████ ██ █ ██ ██   ██ ██  ██  
                  ██   ██  █████  ███  ██ ██   ██  ████   █████   ████   ███ ██      ██   ██  █████       ██   ██      ██ ██ █ ██ ██   ██  ███ ██ 
                                                                                                                       ██                         
                                                                                                                  ██   ██                         
                                                                                                                   █████
                  Ответить
              • Можно, там есть вывод в консоль когда до бряка доходишь
                Ответить
      • Вопрос не конкретно по регуляркам, может быть что угодно, например, xpath, любой вызов.
        Ответить
        • ███████                                                                                                                         
          ██   ██                                                                                                                         
          ██   ██                                                                                                                         
          ██   ██  █████     ████ ██   ██ ██████  █████  ██████  ████        ██   ██  █████       ██   ██ ██   ██ ██ █ ██ ██   ██  ████   
          ██   ██ ██   ██   ██ ██ ██   ██ █ ██ █ ██   ██ █ ██ █     ██       ██   ██ ██   ██      ██   ██ ██   ██ ██ █ ██ ██   ██     ██  
          ██   ██ ██   ██  ██  ██ ██  ███   ██   ██   ██   ██    █████       ██   ██ ██   ██      ██   ██ ██   ██  █ █ █  ██   ██  █████  
          ██   ██ ██   ██  ██  ██ ██ █ ██   ██   ██   ██   ██   ██  ██       ███████ ███████      ███████ ██   ██  █████  ███████ ██  ██  
          ██   ██ ██   ██  ██  ██ ███  ██   ██   ██   ██   ██   ██  ██       ██   ██ ██           ██   ██ ██   ██  █ █ █  ██   ██ ██  ██  
          ██   ██ ██   ██  ██  ██ ██   ██   ██   ██   ██   ██   ██  ██       ██   ██ ██   ██      ██   ██  ██████ ██ █ ██ ██   ██ ██  ██  
          ██   ██  █████  ███  ██ ██   ██  ████   █████   ████   ███ ██      ██   ██  █████       ██   ██      ██ ██ █ ██ ██   ██  ███ ██ 
                                                                                                               ██                         
                                                                                                          ██   ██                         
                                                                                                           █████
          Ответить
          • ███████                                                                                                                         
            ██   ██                                                                                                                         
            ██   ██                                                                                                                         
            ██   ██  █████     ████ ██   ██ ██████  █████  ██████  ████        ██   ██  █████       ██   ██ ██   ██ ██ █ ██ ██   ██  ████   
            ██   ██ ██   ██   ██ ██ ██   ██ █ ██ █ ██   ██ █ ██ █     ██       ██   ██ ██   ██      ██   ██ ██   ██ ██ █ ██ ██   ██     ██  
            ██   ██ ██   ██  ██  ██ ██  ███   ██   ██   ██   ██    █████       ██   ██ ██   ██      ██   ██ ██   ██  █ █ █  ██   ██  █████  
            ██   ██ ██   ██  ██  ██ ██ █ ██   ██   ██   ██   ██   ██  ██       ███████ ███████      ███████ ██   ██  █████  ███████ ██  ██  
            ██   ██ ██   ██  ██  ██ ███  ██   ██   ██   ██   ██   ██  ██       ██   ██ ██           ██   ██ ██   ██  █ █ █  ██   ██ ██  ██  
            ██   ██ ██   ██  ██  ██ ██   ██   ██   ██   ██   ██   ██  ██       ██   ██ ██   ██      ██   ██  ██████ ██ █ ██ ██   ██ ██  ██  
            ██   ██  █████  ███  ██ ██   ██  ████   █████   ████   ███ ██      ██   ██  █████       ██   ██      ██ ██ █ ██ ██   ██  ███ ██ 
                                                                                                                 ██                         
                                                                                                            ██   ██                         
                                                                                                             █████
            Ответить
            • ███████                                                                                                                         
              ██   ██                                                                                                                         
              ██   ██                                                                                                                         
              ██   ██  █████     ████ ██   ██ ██████  █████  ██████  ████        ██   ██  █████       ██   ██ ██   ██ ██ █ ██ ██   ██  ████   
              ██   ██ ██   ██   ██ ██ ██   ██ █ ██ █ ██   ██ █ ██ █     ██       ██   ██ ██   ██      ██   ██ ██   ██ ██ █ ██ ██   ██     ██  
              ██   ██ ██   ██  ██  ██ ██  ███   ██   ██   ██   ██    █████       ██   ██ ██   ██      ██   ██ ██   ██  █ █ █  ██   ██  █████  
              ██   ██ ██   ██  ██  ██ ██ █ ██   ██   ██   ██   ██   ██  ██       ███████ ███████      ███████ ██   ██  █████  ███████ ██  ██  
              ██   ██ ██   ██  ██  ██ ███  ██   ██   ██   ██   ██   ██  ██       ██   ██ ██           ██   ██ ██   ██  █ █ █  ██   ██ ██  ██  
              ██   ██ ██   ██  ██  ██ ██   ██   ██   ██   ██   ██   ██  ██       ██   ██ ██   ██      ██   ██  ██████ ██ █ ██ ██   ██ ██  ██  
              ██   ██  █████  ███  ██ ██   ██  ████   █████   ████   ███ ██      ██   ██  █████       ██   ██      ██ ██ █ ██ ██   ██  ███ ██ 
                                                                                                                   ██                         
                                                                                                              ██   ██                         
                                                                                                               █████
              Ответить
    • @@@@@@@                                                                                                                         
      @@   @@                                                                                                                         
      @@   @@                                                                                                                         
      @@   @@  @@@@@     @@@@ @@   @@ @@@@@@  @@@@@  @@@@@@  @@@@        @@   @@  @@@@@       @@   @@ @@   @@ @@ @ @@ @@   @@  @@@@   
      @@   @@ @@   @@   @@ @@ @@   @@ @ @@ @ @@   @@ @ @@ @     @@       @@   @@ @@   @@      @@   @@ @@   @@ @@ @ @@ @@   @@     @@  
      @@   @@ @@   @@  @@  @@ @@  @@@   @@   @@   @@   @@    @@@@@       @@   @@ @@   @@      @@   @@ @@   @@  @ @ @  @@   @@  @@@@@  
      @@   @@ @@   @@  @@  @@ @@ @ @@   @@   @@   @@   @@   @@  @@       @@@@@@@ @@@@@@@      @@@@@@@ @@   @@  @@@@@  @@@@@@@ @@  @@  
      @@   @@ @@   @@  @@  @@ @@@  @@   @@   @@   @@   @@   @@  @@       @@   @@ @@           @@   @@ @@   @@  @ @ @  @@   @@ @@  @@  
      @@   @@ @@   @@  @@  @@ @@   @@   @@   @@   @@   @@   @@  @@       @@   @@ @@   @@      @@   @@  @@@@@@ @@ @ @@ @@   @@ @@  @@  
      @@   @@  @@@@@  @@@  @@ @@   @@  @@@@   @@@@@   @@@@   @@@ @@      @@   @@  @@@@@       @@   @@      @@ @@ @ @@ @@   @@  @@@ @@ 
                                                                                                           @@                                                 
                                                                                                      @@   @@                                                 
                                                                                                       @@@@@                                                   
      																								 
      Ответить
      • %%%%%%%                                                                                                                         
        %%   %%                                                                                                                         
        %%   %%                                                                                                                         
        %%   %%  %%%%%     %%%% %%   %% %%%%%%  %%%%%  %%%%%%  %%%%        %%   %%  %%%%%       %%   %% %%   %% %% % %% %%   %%  %%%%   
        %%   %% %%   %%   %% %% %%   %% % %% % %%   %% % %% %     %%       %%   %% %%   %%      %%   %% %%   %% %% % %% %%   %%     %%  
        %%   %% %%   %%  %%  %% %%  %%%   %%   %%   %%   %%    %%%%%       %%   %% %%   %%      %%   %% %%   %%  % % %  %%   %%  %%%%%  
        %%   %% %%   %%  %%  %% %% % %%   %%   %%   %%   %%   %%  %%       %%%%%%% %%%%%%%      %%%%%%% %%   %%  %%%%%  %%%%%%% %%  %%  
        %%   %% %%   %%  %%  %% %%%  %%   %%   %%   %%   %%   %%  %%       %%   %% %%           %%   %% %%   %%  % % %  %%   %% %%  %%  
        %%   %% %%   %%  %%  %% %%   %%   %%   %%   %%   %%   %%  %%       %%   %% %%   %%      %%   %%  %%%%%% %% % %% %%   %% %%  %%  
        %%   %%  %%%%%  %%%  %% %%   %%  %%%%   %%%%%   %%%%   %%% %%      %%   %%  %%%%%       %%   %%      %% %% % %% %%   %%  %%% %% 
                                                                                                             %%                                                 
                                                                                                        %%   %%                                                 
                                                                                                         %%%%%                                                   
        																								 
        Ответить
        • %%%%%%%                                                                                                                         
          %%   %%                                                                                                                         
          %%   %%                                                                                                                         
          %%   %%  %%%%%     %%%% %%   %% %%%%%%  %%%%%  %%%%%%  %%%%        %%   %%  %%%%%       %%   %% %%   %% %% % %% %%   %%  %%%%   
          %%   %% %%   %%   %% %% %%   %% % %% % %%   %% % %% %     %%       %%   %% %%   %%      %%   %% %%   %% %% % %% %%   %%     %%  
          %%   %% %%   %%  %%  %% %%  %%%   %%   %%   %%   %%    %%%%%       %%   %% %%   %%      %%   %% %%   %%  % % %  %%   %%  %%%%%  
          %%   %% %%   %%  %%  %% %% % %%   %%   %%   %%   %%   %%  %%       %%%%%%% %%%%%%%      %%%%%%% %%   %%  %%%%%  %%%%%%% %%  %%  
          %%   %% %%   %%  %%  %% %%%  %%   %%   %%   %%   %%   %%  %%       %%   %% %%           %%   %% %%   %%  % % %  %%   %% %%  %%  
          %%   %% %%   %%  %%  %% %%   %%   %%   %%   %%   %%   %%  %%       %%   %% %%   %%      %%   %%  %%%%%% %% % %% %%   %% %%  %%  
          %%   %%  %%%%%  %%%  %% %%   %%  %%%%   %%%%%   %%%%   %%% %%      %%   %%  %%%%%       %%   %%      %% %% % %% %%   %%  %%% %% 
                                                                                                               %%                                                 
                                                                                                          %%   %%                                                 
                                                                                                           %%%%%                                                   
          																								 
          Ответить
        • Тоже удачное решение. У меня неплохо смотрится.
          Жирный вариант, правда, не очень.
          Ответить

    Добавить комментарий