У меня есть консольное приложение на python, которое содержит более 300 регулярных выражений. Набор регулярных выражений фиксирован для каждой версии. Когда пользователи запускают приложение, весь набор регулярных выражений будет применяться где угодно от одного раза (очень короткая работа) до тысяч раз (длинная работа).
Я хотел бы ускорить выполнение более коротких заданий, скомпилировав регулярные выражения вперед, рассортировать скомпилированные регулярные выражения в файл и затем загружать этот файл при запуске приложения.
Модуль python re эффективен, а служебные данные компиляции регулярных выражений вполне приемлемы для длинных заданий. Однако для коротких заданий это большая часть общего времени выполнения. Некоторые пользователи захотят запустить множество небольших заданий, чтобы вписаться в их существующие рабочие процессы. Компиляция регулярных выражений занимает около 80 мс. Короткая работа может занять 20 мс-100 мс, исключая компиляцию регулярных выражений. Таким образом, для коротких заданий накладные расходы могут составлять 100% или более. Это с Python27 под Windows и Linux.
Регулярные выражения должны применяться с флагом DOTALL, поэтому их необходимо скомпилировать перед использованием. В этом случае большой кеш компиляции явно не помогает. Как указывали некоторые, метод по умолчанию для сериализации скомпилированного регулярного выражения на самом деле мало что делает.
Модули re и sre компилируют шаблоны на небольшой пользовательский язык со своими кодами операций и некоторыми вспомогательными структурами данных (например, для кодировок, используемых в выражении). Функция рассола в re.py делает простой выход. Это:
def _pickle(p):
return _compile, (p.pattern, p.flags)
copy_reg.pickle(_pattern_type, _pickle, _compile)
Я думаю, что хорошим решением проблемы будет обновление определения _pickle в re.py, которое фактически мариновали скомпилированный объект шаблона. К сожалению, это выходит за рамки моих навыков питона. Уверен, однако, что кто-то здесь знает, как это сделать.
Я понимаю, что я не первый человек, задающий этот вопрос, но, возможно, вы можете быть первым, кто может дать ему точный и полезный ответ!
Ваш совет будет очень благодарен.