Я не вижу в вашем фрагменте кода ничего, что я мог бы действительно оптимизировать. Поэтому я думаю, что нам нужно сделать что-то совершенно другое, чтобы решить вашу проблему.
Ваша проблема, по-видимому, в том, что вы жуете большие объемы данных, и вы медленно форматируете данные в строки и записываете строки в файл. Вы сказали «сбросить», что означает, что вам необходимо регулярно сохранять данные.
Регулярно ли вы сохраняете все данные или только измененные данные? Если вы имеете дело с очень большим набором данных, меняете только некоторые данные и записываете все данные ... это ракурс, который мы могли бы использовать для решения вашей проблемы.
Если у вас большой набор данных, и вы хотите время от времени обновлять его ... вы являетесь кандидатом в базу данных. Реальная база данных, написанная на C для скорости, позволит вам создавать множество обновлений данных и будет поддерживать все записи в согласованном состоянии. Затем вы можете периодически запускать «отчет», который будет извлекать записи и записывать из них ваш текстовый файл фиксированной ширины.
Другими словами, я предлагаю вам разделить проблему на две части: обновить набор данных по частям по мере вычисления или получения большего количества данных и выгрузить весь набор данных в текстовый формат фиксированной ширины для дальнейшей обработки. .
Обратите внимание, что вы можете сгенерировать текстовый файл из базы данных, не останавливая процесс Python, который его обновляет. Вы получите неполный снимок, но если записи независимы, это должно быть хорошо.
Если ваша дальнейшая обработка также выполняется в Python, вы можете просто оставить данные в базе данных навсегда. Не беспокойтесь об обратном циклическом переключении данных через текстовый файл с фиксированной шириной. Я предполагаю, что вы используете текстовый файл фиксированной ширины, потому что данные легко извлечь снова для дальнейшей обработки.
Если вы используете идею базы данных, попробуйте использовать PostgreSQL. Это бесплатно и это настоящая база данных. Для использования базы данных с Python вы должны использовать ORM. Одним из лучших является SqlAlchemy.
Еще один момент, который следует учитывать: если вы сохраняете данные в формате текстового файла с фиксированной шириной для последующего анализа и использования данных в другом приложении, и если это приложение может считывать JSON, а также с фиксированной шириной, возможно, вы мог бы использовать модуль C, который пишет JSON. Это может быть не быстрее, но может; Вы могли бы сравнить его и посмотреть.
Кроме вышесказанного, моя единственная другая идея - разделить вашу программу на «рабочую» часть и «часть обновления», где рабочий генерирует обновленные записи, а часть обновления сохраняет записи на диск. Возможно, пусть они общаются, когда рабочий помещает обновленные записи в текстовом формате на стандартный вывод; и программа обновления считывает данные со стандартного ввода и обновляет свою запись данных. Вместо базы данных SQL программа обновления может использовать словарь для хранения текстовых записей; по мере поступления новых он может просто обновить словарь. Примерно так:
for line in sys.stdin:
id = line[:7] # fixed width: id is 7 wide
records[id] = line # will insert or update as needed
На самом деле программа обновления может хранить два словаря и обновлять один, пока другой записывается на диск.
Разделение на работника и средство обновления - это хороший способ убедиться, что работник не тратит все свое время на обновление, и отличный способ сбалансировать работу между несколькими ядрами ЦП.
У меня пока нет идей.