Подтвердить что ты не робот

Что дальше после пиража?

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

Что дальше?

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

Мне нравится, что грамматика - чистый Python.

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

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

Куда я иду отсюда?

4b9b3361

Ответ 1

Похоже, что пипаристы предвосхитили вашу проблему. Из http://pyparsing.wikispaces.com/HowToUsePyparsing:

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

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

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

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

Сказав это, вы много откажетесь в этом переходе: в принципе любой Python, который вы хотите сделать в своем синтаксическом анализаторе, должен выполняться через API C (не совсем красиво). Кроме того, вам придется привыкнуть к очень различным способам ведения дел. У ANTLR есть свои прелести, но это не основано на комбинаторах, так что между вашим грамматикой и вашим языком нет простой и гибкой связи, которая существует в pyparsing. Кроме того, это собственный DSL, похожий на lex/yacc, который может представить кривую обучения, но, поскольку он основан на LL, вам, вероятно, будет легче адаптироваться к вашим потребностям.

Ответ 2

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

Ответ 3

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

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

Ответ 4

Невозможно узнать, какую выгоду вы получите, не тестируя, но в пределах возможности, что вы можете получить 10-процентную выгоду только от использования Unladen Swallow, если ваш процесс длительный и повторяющийся. (Кроме того, если у вас есть много вещей для синтаксического анализа, и вы обычно начинаете новый интерпретатор для каждого из них, Unladen Swallow становится быстрее - до определенной точки - чем дольше вы запускаете свой процесс, так что, если синтаксический анализ одного входа может не сильно увеличить, вы можете получить значительный выигрыш на втором и третьем входах в том же процессе).

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