У меня есть списки Python, один из которых содержит около 13000 запрещенных фраз, а другой содержит около 10000 предложений.
phrases = [
"phrase1",
"phrase2",
"phrase with spaces",
# ...
]
sentences = [
"sentence",
"some sentences are longer",
"some sentences can be really really ... really long, about 1000 characters.",
# ...
]
Мне нужно проверить каждое предложение в списке предложений, чтобы увидеть, содержит ли оноЛюбая фраза из списка фраз, если это так, я хочу поместить **
вокруг фразы и добавить ее в другой список.Мне также нужно сделать это как можно быстрее.
Это то, что я имею до сих пор:
import re
for sentence in sentences:
for phrase in phrases:
if phrase in sentence.lower():
iphrase = re.compile(re.escape(phrase), re.IGNORECASE)
newsentence = iphrase.sub("**"+phrase+"**", sentence)
newlist.append(newsentence)
Пока этот подход занимает около 60 секунд.
Я пытался использовать многопроцессорность (каждое предложение для цикла было отображено отдельно), однако это дало еще более медленные результаты.Принимая во внимание, что каждый процесс работал примерно на 6% загрузки ЦП, кажется, что накладные расходы делают сопоставление такой небольшой задачи нескольким ядрам не стоящим.Я думал о том, чтобы разделить список предложений на более мелкие куски и отобразить их в отдельные процессы, но не совсем понял, как это реализовать.
Я также рассмотрел использование алгоритма двоичного поиска но не смог выяснить, как использовать это со строками.
Итак, по сути, какой самый быстрый способ выполнить эту проверку?