ищу практические решения для оптимизации скорости разбора текста с помощью python

1

Набор строк должен анализироваться множеством различных именованных регулярных выражений.

Каждая строка передается через каждое регулярное выражение до тех пор, пока не будет найдено совпадение. Когда найдено совпадение, код должен возвращать/давать (с именем regex, value) пары для каждой строки.

Файлы размером 2GB+, поэтому я ищу некоторые идеи для улучшения скорости моих парсеров.

В настоящее время код выполняется через python, но эта часть открыта для изменения. Один из вариантов - преобразовать все в C, чтобы получить больше скорости от PCRE и быстрее (?) IO, но это медленный маршрут, который трудно поддерживать в будущем.

Я ищу практические решения, такие как:

  • преобразование парсеров на более быстрый язык
  • переход на cython (?)
  • разбиение файла на несколько кусков и запуск поверх нескольких потоков
  • 0
    Разве само слово «разбор» не означает, что вы не должны использовать регулярные выражения? Они не подходят для разбора любого вида.
  • 0
    давайте не будем придирчивыми, мне нужно решить проблему, если у вас есть лучшее слово для объяснения моей проблемы, предложите это.
Показать ещё 4 комментария
Теги:
optimization
parsing
text-parsing

3 ответа

4
Лучший ответ

В первом случае я не стал бы беспокоиться о переходе на другой язык. Альтернативные стратегии, вероятно, принесут большую пользу. Механизм regexp, используемый python, записывается в C anyway (iirc).

  • "Оптимизация" регулярных выражений, если возможно ваша первая задача. Как это сделать, зависит от вашего текста и выражения. посмотреть для статей и примеров. @ThomasH также поднимает хороший момент.
  • Самый простой способ оптимизировать регулярное выражение - удалить его; Посмотрите, есть ли возможность переключиться на другие тесты, такие как x in y или line.endswith() и т.д.
  • Попробуйте запустить код pypy. Это может привести к повышению производительности без изменения кода. В вашем случае, хотя выигрыш может быть незначителен, так как производительность привязана к производительности ваших регулярных выражений и файла io.
  • Параллельная обработка файла через несколько потоков/процессов, вероятно, будет полезна. Я бы предложил использовать один процесс для чтения файла и нажимать строки в очередь, из которой вытягиваются несколько процессов. Существует множество способов сделать это. Взгляните на http://effbot.org/zone/wide-finder.htm#a-multi-processor-python-solution
3

Одним из важных моментов для ускорения сопоставления шаблонов в Python является попытка использования регулярного выражения single. Чтобы вместо списка регулярных выражений для каждой строки ввода объединить регулярные выражения в один с |, а затем применить это регулярное выражение для каждой строки:

reg = re.compile(r'''
    (?<patt1>foo)
    |(?<patt2>bar)
''', re.VERBOSE)

for line in lines:
    mo = reg.search(line)
    if mo:
        yield (mo.lastgroup(), mo.group(mo.lastgroup()))
  • 0
    это имеет смысл в серии нескольких оптимизаций, которые я могу сделать, TNX
1

Первое, что приходит мне в голову, это то, что вы должны использовать re.compile(), чтобы подготовить все регулярное выражение. Но я думаю, что это уже сделано!

Еще одна вещь, которую можно рассмотреть, может быть иерархической обработкой:

В зависимости от типа регулярного выражения они могут быть организованы иерархически. Таким образом, вы можете pre- фильтровать строки и только кормить их в регулярное выражение, которое вам нужно проверить.

Например, если вы ищете тег типа "< body attr1 attr2 > " в регулярном выражении, это может помочь выполнить строчку поиска этой строки для "тела" в строке, прежде чем проверять, действительно ли это тег. Вы также можете найти "<" перед использованием регулярного выражения, связанного с тегом.

Он также может ускорить обработку, если вы объедините несколько выражений в один и проверьте соответствие. Подобно замене одиночных проверок на "{term1}" "{term2}" на "{(term1 | term2)}".

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

Простые вещи, подобные этому, могут ускорить ваше приложение, не переключаясь на другой язык или процессор.

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

  • 0
    Выражение re автоматически компилируется Python внутри и последовательно используется как таковой при любом следующем вызове.
  • 0
    хмм..тнкс для информации, я попробую синхронизировать мой анализатор с compile (), чтобы посмотреть, улучшит ли это ситуацию ..

Ещё вопросы

Сообщество Overcoder
Наверх
Меню