Предположим, что word1, word2 ... являются регулярными выражениями:
давайте перепишем эти части:
allWords = [re.compile(m) for m in ["word1", "word2", "word3"]]
Я бы создал одно регулярное выражение для всех шаблонов:
allWords = re.compile("|".join(["word1", "word2", "word3"])
Для поддержки регулярных выражений с | в них вы должны заключить в скобки выражения:
allWords = re.compile("|".join("({})".format(x) for x in ["word1", "word2", "word3"])
(конечно, это также работает со стандартными словами, и все еще стоит использовать регулярные выражения из-за | части)
теперь это замаскированная петля с жестко закодированным каждым термином:
def bar(data, allWords):
if allWords[0].search(data) != None:
temp = data.split("word1", 1)[1] # that works only on non-regexes BTW
return(temp)
elif allWords[1].search(data) != None:
temp = data.split("word2", 1)[1]
return(temp)
можно переписать просто как
def bar(data, allWords):
return allWords.split(data,maxsplit=1)[1]
с точки зрения производительности:
Регулярное выражение компилируется при запуске, поэтому оно работает настолько быстро, насколько это возможно.
здесь нет ни цикла, ни вставленных выражений, часть "или" выполняется механизмом регулярных выражений, который в большинстве случаев представляет собой скомпилированный код: он не может превзойти его в чистом Python.
Матч и раскол делаются за одну операцию
Последний сбой заключается в том, что внутренне механизм регулярных выражений ищет все выражения в цикле, что делает его алгоритмом O (n). Чтобы сделать это быстрее, вам нужно было бы предсказать, какой шаблон является наиболее частым, и поставить его на первое место (моя гипотеза состоит в том, что регулярные выражения являются «непересекающимися», что означает, что текст не может соответствовать нескольким, в противном случае самый длинный должен предшествовать более короткому)