Вы делаете что-то ужасное. Особенно плох поиск по списку вместо множества. Сделайте так:
from ast import literal_eval as eval # ast.literal_eval() безопасный, обычный eval() - нет
with open('input.txt', 'r') as fi, open('output.txt', 'w') as fo:
cache = set()
for line in fi:
title = eval(line).get('title')
if title not in cache:
cache.add(title)
fo.write(line)
Можно оригинально реализовать кэширование декоратором:
from ast import literal_eval as eval
from functools import lru_cache
@lru_cache(None)
def process(title):
print(record, file=fo)
with open('input.txt', 'r') as fi, open('output.txt', 'w') as fo:
for record in map(eval, fi):
process(record['title'])
Ну и глянуть статистику кэша заодно:
>>> process.cache_info()
CacheInfo(hits=994960, misses=5040, maxsize=None, currsize=5040)