Ввод-вывод на самом деле не проблема, и вы ничего не можете с этим поделать: файловый объект и операционная система будут выполнять некоторую форму буферизации. Что вы можете сделать, так это количество вызовов методов, которые вы делаете.
with open("./myFile.txt", "w", newline='\r\n') as f:
f.writelines(f'{doc.number}\n' for doc in allDocuments)
Метод writelines
принимает итерируемую строку для записи в файл. (Документация говорит "список", но, похоже, речь идет о списках, а не list
s; кажется, что выражение генератора тоже работает.) Выражение генератора создает каждую строку по запросу для writelines
.
Вот тест:
import random
def allDocuments():
for i in range(35_000_000):
yield random.randint(0, 100)
with open("tmp.txt", "w", newline='\r\n') as f:
f.writelines(f'{doc}\n' for doc in allDocuments())
Он завершился за 75 секунд (большая часть из-за повторных вызовов random.randint
), используя менее 6 МБ памяти , (Замена вызова на random.randint
на постоянное значение сократила время выполнения до 30 секунд.)