Вы проверяете на somthing in otherthing
- и ваш otherthing
является списком.
Списки хороши для хранения вещей, но поиск "делает х в" ваш список занимает O(n)
.
Используйте взамен set
, который понижает поиск до O(1)
и , он уничтожает любые дубликаты, так что ваш базовый размер вещей также можно искать по каплям, если у вас есть дубликаты.
Если ваш набор впоследствии не изменится, перейдите и используйте frozenset
- который является неизменным.
Чтение: Документирование наборов
Если вы будете следовать предложению @DeepSpace и использовать операции над множествами, вы получите еще большую производительность:
s = set( t.lower().strip() for t in ["Some","text","in","set"])
t = set("Some text in a string that holds other words as well".lower().split())
print ( s&t ) # show me all things that are in both sets (aka intersection)
Вывод:
set(['text', 'some', 'in'])
См. операции над множествами
O (n): наихудший регистр: ваше слово является последним из 200 тыс. Слов в вашем списке, и вы проверяете весь список - что требует 200 тыс. Проверок.
O (1): время поиска является постоянным, независимо от того, сколько элементов в вашей структуре данных, требуется одинаковое количество времени, чтобы проверить, входит ли оно. Чтобы получить это преимущество, set
имеет более сложное решение для хранения, которое требует чуть большепамять (затем список), чтобы работать так хорошо при поисках.
Редактировать: худший случайсценарий для не поиска слова внутри набора / списка:
import timeit
setupcode = """# list with some dupes
l = [str(i) for i in range(10000)] + [str(i) for i in range(10000)] + [str(i) for i in range(10000)]
# set of this list
s = set( l )
"""
print(timeit.timeit("""k = "10000" in l """,setup = setupcode, number=100))
print(timeit.timeit("""k = "10000" in s """,setup = setupcode, number=100))
0.03919574100000034 # checking 100 times if "10000" is in the list
0.00000512200000457 # checking 100 times if "10000" us in the set