Вопрос

У меня огромная грамматика, разработанная для Pyparting как часть большого чистого применения Python. Я достиг пределы настройки производительности, и я в тот момент, когда убывающие возвращения заставляют меня начать искать в другом месте. Да, я думаю, что знаю большинство советов и трюков, и я профилировал свою грамматику и мое приложение в пыль.

Что дальше?

Я надеюсь найти анализатор, который дает мне одинаковую читаемость, удобство использования (я использую много расширенных функций Pyparting, таких как аналитические действия для начала последующей обработки ввода, которая проанализирована) и интеграция Python, но в 10 × производительность.

Я люблю тот факт, что грамматика - чистый питон.

Все мои основные блоки являются регулярными выражениями, поэтому повторное использование их было бы здорово.

Я знаю, что не могу иметь все, чтобы я готов отказаться от некоторых функций, которые у меня есть сегодня, чтобы добраться до запроса 10 × производительность.

Откуда я иду отсюда?

Это было полезно?

Решение

Похоже, что пейпарсистые люди ожидали вашей проблемы. От https://github.com/pyparsing/pyparsing/blob/master/howtousepysing.rst. :

Производительность pyparsing Может быть медленным для сложных грамматических и / или больших входных строк. То psyco пакет может быть использован для улучшения скорости pyparsing Модуль без изменений в грамматике или программированной логике - наблюдаемые улучшению в диапазоне 20-50%.

Однако, как отметил Ванль в комментариях ниже, psyco является устаревшим проектом по состоянию на март 2012 года. Его преемник является Выпивка Проект, который начинается с того же основного подхода к производительности: используйте JIT Native-Code Compiler вместо интерпретатора Bytecode. Вы должны быть в состоянии достичь подобных или больших прибылей с помощью Pypy, если для вас будут работать реализация Python Python.

Если вы действительно скорость демона, но хотите сохранить некоторые из разборчивости и декларативного синтаксиса, я бы предложил посмотреть на Antlr. Вероятно, не генерирующая питона; Я скептически подразумевает ли это зрелый или высокопроизводительный для ваших потребностей. Я говорю о товарах: C Backend, которая начала все это.

Оберните модуль расширения Python C вокруг точки входа в анализатор и выверните его.

Сказав это, вы будете много сдаваться в этом переходе: в основном любой Python, который вы хотите сделать в своем парсере, придется выполняться через C API (не совсем красиво). Кроме того, вам придется привыкнуть к совершенно другим способам делать вещи. Antlr имеет свои подвески, но он не основан на комбинаторах, поэтому между вашей грамматикой нет легких и жидкости между вашей грамматикой и вашим языком, что есть в Pyparding. Плюс, это свой собственный DSL, очень похожий на Lex / YACC, который может представить кривую обучения - но, потому что она основана на основе, вы, вероятно, уйдут его проще адаптироваться к вашим потребностям.

Другие советы

Переключитесь на сгенерированный анализатор C / C ++ (с использованием ANTLR, Flex / Bison и т. Д.). Если вы можете задержать все Правила действия до тех пор, пока вы не закончите расставание, вы можете создать AST с тривиальным кодом, а затем передать это обратно к вашему коду Python через что-то вроде Swig, и процесс на нем с вашими текущими действиями действий. OTOH, для этого, чтобы дать вам скорость повышения, разбор должен быть тяжелой подъемом. Если ваши правила действий являются большая стоимость, то это ничего не купит вам, если вы не испишите свои правила действий в C, а также в C, а вам, возможно, придется сделать это в любом случае, чтобы избежать платы за любой несовмешитель импеданса, который вы получаете между кодом Python и C) Отказ

Если вы действительно хотите выступление для крупных грамматиков, не смотри не дальше, чем SimpleParse. (который сам полагается на MXTextTools, расширение C). Тем не менее, теперь знайте, что это происходит по стоимости быть более загадочным и требовать, чтобы вы были хорошо разбираются в EBNF.

Это определенно не тем больше Pythonic Route, и вам придется начать по всей грамматике EBNF, чтобы использовать SimpleSace.

Там нет способа узнать, какую пользу вы получите, не просто тестируя его, но в диапазоне возможности вы можете получить 10 × Ненадельное ласточка Если ваш процесс долго работает и повторяется. (Кроме того, если у вас есть много вещей, и вы обычно начинаете новый интерпретатор для каждого, Shalla Flow One, Neonalled продвигается быстрее - к точке - чем дольше вы запускаете свой процесс, поэтому, когда разбирается один вклад, может не показывать многое значение Получите значительные выгоды на 2-м и 3-м входах в том же процессе).

(Примечание: вытащить последний из SVN - вы получите гораздо лучшую производительность, чем последний тарбол)

Немного поздно на вечеринку, но PLY (Python Lex-YACC), Служил меня очень хорошо. PLY дает вам чистый Python Framework для построения токенизаторов на основе LEX, а также на основе YACC Американские анализаторы.

Я пошел этот маршрут, когда я ударил проблемы с производительностью с помощью Pyparding.

Вот несколько старая, но все еще интересная статья о Python Parsing, который включает в себя ориентиры для ANTLR, PLY и PYPARSING. Отказ PLY примерно в 4 раза быстрее, чем pyparding в этом тесте.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top