Проверить, есть ли в файле любые из 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 шт):
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
Я нахожу в итоге пересечение двух можеств, которые представляют собой данные из файлов.