Вы можете использовать блоки размером более одной строки и выполнять двоичный ввод-вывод - каждый может немного увеличить скорость (хотя в Linux двоичный ввод-вывод не будет, поскольку он идентичен текстовому вводу-выводу):
BLOCKSIZE = 1024*1024
with open(tmpfile, 'rb') as inf:
with open(tmpfile, 'wb') as ouf:
while True:
data = inf.read(BLOCKSIZE)
if not data: break
converted = data.decode('latin1').encode('utf-8')
ouf.write(converted)
Побайтовый анализ, подразумеваемый при построчном чтении, преобразовании конца строки (не в Linux ;-) и кодировании-декодировании в стиле codecs.open, должен быть частью того, что замедляет вас. Этот подход также переносим (как у вас), поскольку управляющие символы, такие как \n
, в любом случае не нуждаются в переводе между этими кодеками (в любой ОС).
Это работает только для входных кодеков, которые не имеют многобайтовых символов, но `latin1 'является одним из них (не имеет значения, имеют ли выходные кодеки такие символы или нет).
Попробуйте использовать блоки разных размеров, чтобы найти наилучшее решение в зависимости от вашего диска, файловой системы и доступной оперативной памяти.
Редактировать : изменен код для @ комментария Джона и уточнены условия в соответствии с @ gnibbler.