Часто люди говорят, что не рекомендуется использовать рекурсивные функции в python (ограничения глубины рекурсии, потребление памяти и т.д.)
Я взял пример перестановки из этого вопроса .
def all_perms(str):
if len(str) <=1:
yield str
else:
for perm in all_perms(str[1:]):
for i in range(len(perm)+1):
yield perm[:i] + str[0:1] + perm[i:]
Впоследствии я преобразовал его в нерекурсивную версию (я новичок в Python)
def not_recursive(string):
perm = [string[0]]
for e in string[1:]:
perm_next = []
for p in perm:
perm_next.extend(p[:i] + e + p[i:] for i in range(len(p) + 1))
perm = perm_next
for p in perm:
yield p
И сравнил их
before=time()
print len([p for p in all_perms("1234567890")])
print "time of all_perms %i " % (time()-before)
before=time()
print len([p for p in not_recursive("1234567890")])
print "time of not_recursive %i " % (time()-before)
before=time()
print len([p for p in itertools.permutations("1234567890")])
print "time of itertools.permutations %i " % (time()-before)
Результаты довольно интересные. Рекурсивная функция - самая быстрая 5 секунд, затем не рекурсивная 8 секунд, затем встроенная 35 секунд
Итак, рекурсивные функции , которые плохи в Python? Что не так со встроенным itertools. перестановки?