Для скорости вы действительно хотите избежать многократного зацикливания одного и того же файла. Это означает, что вы превратились в алгоритм O (N * M), когда вы могли бы использовать алгоритм O (N + M).
Чтобы достичь этого, прочтите список идентификаторов в структуре быстрого поиска, например, в виде набора. Поскольку в памяти только 4600, эта форма в памяти не должна быть проблемой.
Новое решение также считывает список в память. Вероятно, это не большая проблема с несколькими сотнями тысяч строк, но она тратит больше памяти, чем нужно, поскольку вы можете сделать все это за один проход, только считывая меньший файл ids.txt в память. Вы можете просто установить флаг, когда предыдущая строка была чем-то интересным, что будет сигнализировать следующую строку, чтобы записать это.
Вот переработанная версия:
with open('ids.txt', 'rU') as f:
interesting_ids = set('>' + line.lower()[0:4] + "_" + line[4] for line in f) # Get all ids in a set.
found_id = None
with open('seqres.txt', 'rU') as g:
for line in g:
if found_id is not None:
with open(found_id+'.fasta','w') as h:
h.write(line)
id = line[:7]
if id in interesting_ids: found_id = id
else: found_id = None