Есть ли способ по-настоящему обработать скомпилированные регулярные выражения в Python?

У меня есть консольное приложение на Python, которое содержит более 300 регулярных выражений. Набор регулярных выражений фиксирован для каждого выпуска. Когда пользователи запускают приложение, весь набор регулярных выражений будет применяться от одного раза (очень короткое задание) до тысяч раз (длинное задание).

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

Модуль python re эффективен, и накладные расходы на компиляцию регулярных выражений вполне приемлемы для длительных задач. Однако для коротких работ это значительная часть общего времени выполнения. Некоторым пользователям нужно выполнять множество небольших заданий, чтобы они соответствовали существующим рабочим процессам. Компиляция регулярных выражений занимает около 80 мс. Короткое задание может занять от 20 до 100 мс без компиляции регулярного выражения. Таким образом, для коротких работ накладные расходы могут составлять 100% и более. Это с Python27 как под Windows, так и под Linux.

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

Модули re и sre компилируют шаблоны в небольшой пользовательский язык со своими собственными кодами операций и некоторыми вспомогательными структурами данных (например, для кодировок, используемых в выражении). Функция pickle в re.py находит простой выход. Это:

def _pickle(p):
    return _compile, (p.pattern, p.flags)

copy_reg.pickle(_pattern_type, _pickle, _compile)

Я думаю, что хорошим решением проблемы было бы обновление определения _pickle в re.py, которое фактически обработало скомпилированный объект шаблона. К сожалению, это выходит за рамки моих навыков Python. Но держу пари, что кто-то здесь знает, как это сделать.

Я понимаю, что я не первый, кто задает этот вопрос - но, возможно, вы сможете первым дать точный и полезный ответ на него!

Мы будем очень признательны за ваш совет.

18
задан Ned Batchelder 27 October 2010 в 22:36
поделиться