Я предлагаю следующий метод:
"\n".join(re.findall("(?s).{,64}", s))[:-1]
Это, более или менее, метод не-RE, использующий преимущества механизма RE для цикла.
На очень медленном компьютере, который у меня есть в качестве домашнего сервера, это дает:
$ python -m timeit -s 's="0123456789"*100; import re' '"\n".join(re.findall("(?s).{,64}", s))[:-1]'
10000 loops, best of 3: 130 usec per loop
Метод AndiDog:
$ python -m timeit -s "s='0123456789'*100; import re" 're.sub("(?s)(.{64})", r"\1\n", s)'
1000 loops, best of 3: 800 usec per loop
2-ая Герни Алекса / метод Майкла:
$ python -m timeit -s "s='0123456789'*100" '"\n".join(s[i:i+64] for i in xrange(0, len(s), 64))'
10000 loops, best of 3: 148 usec per loop
Я не считаю метод textwrap
правильным для спецификации вопроса, поэтому я не буду его оценивать.
EDIT
Изменен ответ, потому что он был неправильным (позор мне!)
РЕДАКТИРОВАТЬ 2
Просто для удовольствия, метод RE-free с использованием itertools
. По скорости он занимает третье место, и это не Pythonic (слишком шумно):
"\n".join(
it.imap(
s.__getitem__,
it.imap(
slice,
xrange(0, len(s), 64),
xrange(64, len(s)+1, 64)
)
)
)
$ python -m timeit -s 's="0123456789"*100; import itertools as it' '"\n".join(it.imap(s.__getitem__, it.imap(slice, xrange(0, len(s), 64), xrange(64, len(s)+1, 64))))'
10000 loops, best of 3: 182 usec per loop