Предположим, что мне нужно обрабатывать очень большой список слов, и мне нужно подсчитать количество раз, когда я нахожу любое из этих слов в тексте, который у меня есть. Каков наилучший вариант с точки зрения масштабируемости?Устанавливает против Regex для поиска строк, который является более масштабируемым?
Вариант I (регулярное выражение)
>>> import re
>>> s = re.compile("|".join(big_list))
>>> len(s.find_all(sentence))
Вариант II (наборы)
>>> s = set(big_list)
>>> len([word for word in sentence.split(" ") if word in s]) # O(1) avg lookup time
Пример: если список [ "кошка", "собака", "колено"] и текст «собака прыгнула над котом, но собака сломала ему колено», конечный результат должен быть: 4
PS Любая другая опция приветствуется
Обратите внимание, что ваши две опции возвращают разные результаты даже по вашим тестовым данным. (параметр 'set' не будет вызывать' 'cat '', тогда как в regex будет). – mgilson
[Aho-Corasick] (http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm) быстрый и умный, но я не знаю о реализации Python. – msw
@msw: В нижней части статьи есть ссылка на ссылку: http://papercruncher.com/2012/02/26/string-searching-using-aho-corasick/ – Blender