Есть два способа, которые, как я вижу, могут значительно улучшить здесь производительность.
set
вместо list
Ваш код должен проверять, есть ли строка является участником stopwords
лота. Список - не лучшая структура данных для этого, поскольку в худшем случае он требует сравнения с каждым элементом в списке. Тест на членство для списка - O (n).
set
s намного быстрее выполняют этот тест членства. Их реализация в Python представляет собой что-то вроде ha sh table , что означает, что они могут выполнять проверку принадлежности за постоянное время, O (1). Таким образом, для большого количества элементов set
будет значительно превосходить list
для этой конкретной операции.
Вы можете создать set
из stopwords
вместо списка с:
stopwords = set(['a','the','with','etc'])
re.finditer
вместо str.split()
Если ваш txt
большой, и вам требуется только первая подходящая подстрока вашего txt
(как подразумевается в вопросе), то вы можете добиться большей производительности, используя re.finditer
вместо str.split()
для разделения слов вашего текста.
str.split()
возвращает список слов из всего текста в один раз, тогда как re.finditer
возвращает итератор, который может выдавать слова по мере необходимости. В худшем случае вам, очевидно, все равно понадобится 'l oop' по всему тексту, но если ваши совпадения близки к началу txt
, экономия времени и памяти может быть значительной.
Для пример:
txt='A single house painted white with a few windows'
stopwords = set(['a','the','with','etc'])
import re
split_txt = (match.group(0) for match in re.finditer(r'\S+', txt))
result = []
word = next(split_txt)
while word.lower() in stopwords:
word = next(split_txt)
while word.lower() not in stopwords:
result.append(word)
word = next(split_txt)
print(' '.join(result))
Обратите внимание, что часто лучше просто начать с некоторого кода, который работает для проверки ваших входных данных, чем преждевременно начинать оптимизацию. Тестирование покажет, нужна ли оптимизация. Вы говорите в вопросе, что
цикл никогда не является способом go в Python
, но это просто неверно. Зацикливание в той или иной форме на любом языке чаще всего неизбежно. Хотя производительность может не соответствовать производительности скомпилированных языков, таких как C или Fortran, Python может удивить вас своей производительностью (если вы позволите)