Проверить, есть ли в файле любые из 10 слов

У меня есть файл english_2000.txt, в котором содержится 2000 слов:

...
fan
fancy
fantasy
farm
...

Я пытаюсь найти способ максимально быстро проверить, есть ли файле любые 10 английских слов из списка:

import mmap
import re

list_words = []
with open('english_2000.txt', 'rb') as file_words:
    for word in file_words:
        list_words.append(word)
list_words = [x.decode('UTF-8').strip().encode('UTF-8') for x in list_words]

with io.open('source_text.txt', 'rb') as file_for_search:
    count_find_words = 0
    for word_search in list_words:
        result_search = re.search(re.compile(word_search), mmap.mmap(file_for_search.fileno(), 0, access=mmap.ACCESS_READ))
        if result_search:
            count_find_words += 1
            if count_find_words == 10:
                print('Найдены 10 слов!')
                break

Этот способ работает, но не достаточно быстро. Подскажите способ, как можно ускорить алгоритм. Может быть есть способ решить задачу по-другому? Я пытаюсь уйти от чтения файлов в текстовом режиме и использовать чтение в режиме "rb", чтобы читать данные с диска максимально быстро.


Ответы (1 шт):

Автор решения: Dmitry

2000 тысячи слов - не так уж и много. Как я написал в комментарии, отказаться от регулярных выражений и использовать другие типы данных для начала

words = ("in", "english", "word")

with open("source_text.txt") as file:
  text = file.read().lower()
  set_words = set(text.split())
  count = 0
  for word in words:
    if word in set_words:
      count += 1

print(f"Найдено {count} слов")

UPD

Добавлю реальное применение алгоритма

from datetime import datetime
import time

start_time = datetime.now()

import string

pattern = string.punctuation + string.digits

with open("source.txt", "rb") as file:
    clear_text = file.read().translate(None, bytes(pattern, "utf-8")).lower() 
    clear_set = set(clear_text.split())


with open("words.txt", "rb") as file:
    clear_words = set(file.read().split())

result = clear_set & clear_words

if len(result) >= 10:
    print(f"найдено больше чем 10 слов")
else:
    print(f"найдено {len(result)} слов")

print(datetime.now() - start_time)

Входные данные

words.txt -> 1000 уникальных слов через перевод строки

source.txt -> обычный текст содержащий 17547 слов, этот текст

Вывод

найдено больше чем 10 слов
0:00:00.001999

Я нахожу в итоге пересечение двух можеств, которые представляют собой данные из файлов.

→ Ссылка