Задать вопрос
@DeadAndDieFox

Как оптимизировать большое количество регулярных выражений?

У меня имеется переменная в которой 800000 уникальный текстовых записей, а так же переменная с 10000 уникальный регулярных выражение. Мне нужно максимально быстро проверить, какие тексты проходят по регуляркам (если текст подошёл хотя бы к одной, то можно переходить к следующему тексту).
На данный момент я увеличил объём кэша и из этого выжал максимум пользы, однако, этого мало. Сама программа работает по следующей логике. Я запускаю цикл, который проходится по каждому тексту отдельно, а в нём уже запускаю цикл, который проходится по каждому регулярному выражению. Таким образом подставляю в re.compile(pattern) re.match(text). Если есть матч, выхожу из цикла, возвращаю текст в успешный файл, а если не подходит ни один паттерн, то цикл завершается и возвращает текст в неудачный файл.
Как это можно оптимизировать? Сначала пытался через Numba, но позже выяснил, что regex она не поддерживает, да и в этом нет необходимости. Проблема именно во вложенности, ведь неподходящие ни к чему тексты перебирают все 10k регулярок, тем самым замедляя поиск.

Абстрактный код:
for i in texts:
    error = True
    for j in patterns:
        reg = re.compile(j)
        result = reg.match(i)
        if result != None:
            success.append(i)
            error = False
            break
    if error == True:
        error.append(i)
  • Вопрос задан
  • 180 просмотров
Подписаться 2 Простой 7 комментариев
Решения вопроса 1
Aetae
@Aetae
Тлен
Ну очевидно, что надо хранить реги уже скомпилированными, исключив шаг re.compile из цикла.
Далее можно вести статистику и поднимать(тем или иным образом) более частые реги в массиве повыше.
Ну а дальше уже использование каких-нить низкоуровневых либ, но ИМХО и первого должно хватить.)
...Ещё можно распараллелить, но хз какие у тебя там ресурсы по ядрам.
...Ещё можно склеить эти 10к регулярок в одну и прогнать через глубокий оптимизатор регулярок. Если результат выйдет адекватным, то можно предварительно проверять текст на соответствие такой единой оптимизированной регулярке. Но это, понятное дело, сильно зависит от твоего набора.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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