опасность рекурсивных функций

Часто люди говорят, что не рекомендуется использовать рекурсивные функции в 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. перестановки?

7
задан Community 23 May 2017 в 12:24
поделиться