Разбить на многопоток. Python
Программа ищет слово в нескольких файлах (Поиск слова "Yes", пример содержания файла "0 sp Yes yes S". Необходимо переделать код под многопоток, но опыта с этим в пайтоне не имею. Особенно не очень представляю, как переделать читание файлов. Буду рад любой помощи.
import os
path = r'C:\Users\Admin\Desktop\project1'
word = 'Yes'
count = 0
for root, dirs, files in os.walk(path):
for file in files:
if file.lower()[-4:] == '.txt':
with open(os.path.join(root, file)) as in_put:
if not word in in_put.read():
print('-')
else:
in_put.seek(0)
for row, line in enumerate(in_put):
if word in line:
count += 1
print(f'Найденных слов: {count}')
Ответы (2 шт):
Выигрыш этой затеи сомнителен в плане производительности - в основном всё упрётся в скорость чтения файлов и, в случае HDD, процесс может даже замедлиться, потому что HDD долго "перескакивает" с одного файла на другой.
Но можете попробовать переделать обход файлов на генератор, а потом "скормить" этот генератор в multiprocessing.Pool.map, написав отдельную функцию для подсчёта нужных штук в одном конкретном файле. Потом собираете результаты Pool.map и складываете их. Всё.
from concurrent.futures import ThreadPoolExecutor, as_completed
def open_file(filename):
files = {
'file1': '0 sp Yes yes S',
'file2': 'No Yes',
'file3': 'No 0 S sp',
}
return files.get(filename, '')
def find_words(filename, word):
file_content = open_file(filename)
return file_content.count(word)
WORD = 'Yes'
with ThreadPoolExecutor(max_workers=8) as executor: # Max workers up to threads in your pc
features = [executor.submit(find_words, filename=f, word=WORD) for f in ('file1', 'file2', 'file3')]
count = sum(feature.result() for feature in as_completed(features))
print(f'Найденных слов: {count}')