запись быстрого синтаксического анализатора в Python

Я записал практический рекурсивный чистый синтаксический анализатор Python для некоторого формата файла (ARFF), мы используем в одной лекции. Теперь выполнение моего представления осуществления является ужасно медленным. Оказывается, что безусловно большая часть времени проведена в моем синтаксическом анализаторе. Это использует много процессорного времени, HD не является узким местом.

Интересно, что производительные пути там для записи синтаксического анализатора в Python? Я не переписал бы его в C. Я пытался использовать jython, но ту уменьшенную производительность много! Файлы, которые я анализирую, частично огромны (> 150 МБ) с очень длинными строками.

Для моего текущего синтаксического анализатора только нужно предвидение одного символа. Я отправил бы источник здесь, но я не знаю, является ли это такой хорошей идеей. После того, как весь крайний срок представления еще не закончился. Но затем, фокусом в этом осуществлении не является синтаксический анализатор. Можно выбрать любой язык, который Вы хотите использовать и уже существует синтаксический анализатор для Java.

Примечание: У меня есть x86_64 система так психо (и это кажется также PyPy), не никакая опция.

Обновление: Я теперь загрузил свой синтаксический анализатор/устройство записи на битоприемник.

8
задан panzi 2 May 2010 в 17:23
поделиться

2 ответа

Вы можете использовать ANTLR или pyparsing , они могут ускорить процесс синтаксического анализа.

И если вы хотите сохранить текущий код, вы можете посмотреть Cython / PyPy , который увеличивает вашу производительность (иногда до 4x).

8
ответ дан 5 December 2019 в 11:23
поделиться

Самый общий совет, который я бы дал без дополнительной информации, - это прочитать весь файл или, по крайней мере, его значительную часть, в память сразу . Вы не хотите читать его по одному символу за раз и искать здесь и там; независимо от буферизации, которая происходит под капотом, вероятно, неплохо просто сохранить все это в памяти, чтобы вы могли работать с ней, как хотите.

Я написал синтаксические анализаторы на Python, и нет особого требования, чтобы они были особенно медленнее, чем синтаксический анализатор, написанный на любом другом языке. Как и в случае с подобными вещами, более вероятно, что вы выполняете работу, в которой вам не нужно делать. Из этого класса предметов создание, уничтожение и воссоздание одного и того же объекта обходится дороже, чем просто его где-то хранить. Повторное вычисление значения снова и снова обходится дороже, чем просто его где-то хранить. И т. Д. И т. Д.

В частности, в Python люди попадают в ловушку, выполняя множество ненужных манипуляций со строками. Не добавляйте к строкам по одному символу за раз; когда вы накапливаете свои жетоны, проделайте свою работу с «основной» строкой и вычеркните жетон одним махом. (Другими словами, проиндексируйте «главную» строку, определите начальную и конечную точки, а затем возьмите ее с помощью token = master [start: end] .Объединение строк по одному символу - короткий путь к снижению производительности. Я подозреваю, что даже если вы хотите / по какой-то причине хотите выполнить для c в master: newstr + = c , возможно, вам больше повезет, если вы вставите «c» в список, а затем newstr = ''. присоединиться (newstr_charlist) .

7
ответ дан 5 December 2019 в 11:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: