Вероятно, основным узким местом является повторяющееся открытие для добавления внутрь плотного l oop. Операционная система должна будет открывать файл и искать его до конца каждый раз, когда вы в него пишете. Если вам нужно, чтобы несколько писателей имели доступ к концу файла, возможно, запустите каждого из них с выводом в отдельный файл, а затем объедините файлы результатов, когда все писатели будут готовы.
Я также немного подозрительно относится к порядку, в котором вы читаете файлы. Очевидно, необработанный файл r_isa.txt
больше, но если он содержит меньше строк, чем файл keywords.txt
, возможно, переключите их. Как правило, попробуйте прочитать меньший набор данных в память, затем l oop поверх большего файла, по одной строке за раз.
Вот попытка полностью без Pandas. Вероятно, в его использовании нет ничего плохого, но здесь он также не представляет особой ценности.
Я также переключился на использование регулярного выражения; мне не ясно, приведет ли это к повышению производительности, но, по крайней мере, он должен показать вам, как это сделать, чтобы вы могли измерять и сравнивать.
import re
keywords = []
with open("keywords_file.txt") as kwfile:
keywords = [line.rstrip('\n') for line in kwfile]
regex = re.compile(r'\b(?:' + '|'.join(keywords) + r')\b')
with open("r_isa.txt") as readfile, open('isa.txt', 'w') as writefile:
for line in readfile:
firstfield = line.split('\t')[0]
m = regex.match(firstfield)
if m:
writefile.write(line)
Регулярные выражения хороши для поиска подстроки совпадения и вариации; если вам просто нужна каждая строка, где ровно первое поле существует дословно как строка в файле ключевых слов, это почти наверняка будет быстрее:
for line in readfile:
firstfield = line.split('\t')[0]
if firstfield in keywords:
writefile.write(line)
, а затем, конечно, взять out import re
и присваивание regex
. Возможно также преобразовать keywords
в set()
.