【发布时间】:2018-02-15 00:54:09
【问题描述】:
经常有人说python中不建议使用递归函数(递归深度限制、内存消耗等)
我从this question 中获取了一个排列示例。
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.permutations 有什么问题?
【问题讨论】:
-
我们可以假设您检查了三个函数的输出是否相同?
-
至少大小是一样的。我检查了 3 个元素的完整列表,它们是相同的