Куча говна / Говнокод #20415 Ссылка на оригинал

0

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

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

Запостил: kipar kipar, (Updated )

Комментарии (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'а, а бакс - у правой. Или я неправильно читаю?
                Ответить
                  • Нахуя 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)
                                Тут ничего не лагает.
                                Ответить
                                • > Тут ничего не лагает.
                                  А если перевернуть - лагает:
                                  res = re.sub("[\s\u200c]+$", "", " "*20000 + 'aaa' + ' ')
                                  Ответить
  • бэктрекинг всегда был слегка отстоем. это отрезание пробелов конечно странный случай (я именно такого в перле делал тоннами - ни разу проблем не было) но в общем случае народ просто хочет рекурсивные/вложеные регулярки.
    Ответить
      • Пусть у нас есть регулярка "a+$" и мы её применяем к строке "aaaaab". "aaaaa" отлично матчится, но вместо конца строки мы видим "b". Тупой движок делает откат и пытается приладить регулярку к "aaaaab", она опять не подходит, и к "aaaaab", и к "aaaaab"... И до него только в самом конце доходит, что шаблон не сходится. Очевидно, что это даёт O(n^2) от длины строки.

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

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

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

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

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

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

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

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

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

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

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

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

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8