Одно замечание: прежде чем идти на оптимизацию, очень важно получить хорошее измерение и профилирование.
Тем не менее, я бы поспорил, что медленная часть на втором этапе - это связь с базой данных; Вы можете попытаться проанализировать оператор SQL и план его выполнения. а затем оптимизировать его (это одна из функций SQLAlchemy); если все равно это будет слишком медленно, проверьте оптимизацию базы данных.
Конечно, возможно, узкое место окажется в совершенно другом месте; в этом случае у вас все еще есть шансы оптимизировать с использованием кода C, выделенной сети или нескольких потоков - просто чтобы привести три возможных примера совершенно разных видов оптимизации.
Еще один момент: поскольку операции ввода-вывода обычно освобождают GIL, вы также можете попытаться улучшить производительность, просто добавив еще один поток для чтения - и я думаю, что это может быть гораздо более дешевым решением.