Скорее всего более правильным решением будет создание генератора, так как этот список будет обрабатываться циклом for. Но даже если это и не так, попробуйте выполнить следующий код:
# -*- coding: utf-8 -*-
import timeit
def div_str(string, part_lenght):
for n in xrange(len(string)//part_lenght):
yield string[n * part_lenght : (n+1) * part_lenght]
if string[(n+1) * part_lenght : (n+2) * part_lenght]:
yield string[(n+1) * part_lenght : (n+2) * part_lenght]
print list(div_str("0123456789", 4))
print list(div_str("0123456789", 2))
print timeit.Timer('for _ in div_str("0123456789" * 10000, 30): pass',
'from __main__ import div_str').timeit(1000)
print timeit.Timer('list(div_str("0123456789" * 10000, 30))',
'from __main__ import div_str').timeit(1000)
print '-=-' * 10
def div_str(string, part_lenght):
from cStringIO import StringIO
sio = StringIO(string)
while True:
d = sio.read(part_lenght)
if not d:
return
yield d
print list(div_str("0123456789", 4))
print list(div_str("0123456789", 2))
print timeit.Timer('for _ in div_str("0123456789" * 10000, 30): pass',
'from __main__ import div_str').timeit(1000)
print timeit.Timer('list(div_str("0123456789" * 10000, 30))',
'from __main__ import div_str').timeit(1000)
print '-=-' * 10
from textwrap import wrap
print wrap("0123456789", 4)
print wrap("0123456789", 2)
print timeit.Timer('for _ in wrap("0123456789" * 10000, 30): pass',
'from textwrap import wrap').timeit(1000)
ИМХО, второй вариант самый понятный и красивый и поучительный.