Операционные системы уже оптимизированы для таких операций ввода-вывода. Таким образом, вы можете напрямую записать числа в файл и получить очень хорошую скорость:
import tempfile, random
with tempfile.NamedTemporaryFile(delete=False) as nf:
for _ in xrange(1000000): # xrange() is more efficient than range(), in Python 2
nf.write(str(random.randint(0, 1000)))
На практике числа будут записываться на диск только тогда, когда оптимизированный по размеру файловый буфер заполнен. Код в вопросе и код выше занимают одно и то же время на моей машине. Поэтому я бы посоветовал использовать мой более простой код и полагаться на встроенные оптимизации операционной системы.
Если результат помещается в памяти (как в случае с 1 миллионом чисел), тогда вы действительно можете сохранить некоторые операции ввода-вывода, создав последнюю строку и записав ее за один раз:
with tempfile.NamedTemporaryFile(delete=False) as nf:
nf.write(''.join(str(random.randint(0, 1000)) for _ in xrange(1000000)))
Этот второй подход на моем компьютере работает на 30% быстрее (2,6 с вместо 3,8 с), вероятно, благодаря единственному вызову записи (вместо миллиона write()
вызовов - и, возможно, гораздо меньшему количеству фактических операций записи на диск).
Подход "много больших записей" в вашем вопросе находится посередине (3,1 с). Это может быть улучшено, хотя: это более ясно и более Pythonic написать это так:
import tempfile, random
with tempfile.NamedTemporaryFile(delete=False) as nf:
for _ in xrange(1000):
nf.write(''.join(str(random.randint(0, 1000)) for _ in xrange(1000)))
Это решение эквивалентно, но быстрее, чем код в исходном вопросе (2,6 с на моем компьютере вместо 3,8 с).
Таким образом, первый простой подход, описанный выше, может быть достаточно быстрым для вас. Если это не так, и если весь файл может поместиться в памяти, второй подход является очень быстрым и простым. В противном случае, ваша первоначальная идея (меньше записей, большие блоки) хороша, так как она примерно такая же быстрая, как и подход с «одной записью», и все же довольно проста, когда написана, как указано выше.