在Python中,将一个纯递归函数转换为递归生成器(不是普通生成器),性能似乎会下降。
例如,下面是两个查找列表所有组合的函数之间的性能比较:
以下是输出结果:
例如,下面是两个查找列表所有组合的函数之间的性能比较:
from datetime import datetime as dt
def rec_subsets(ms, i=0, s=[]):
if i == len(ms):
# do something with s
return
rec_subsets(ms, i+1, s)
rec_subsets(ms, i+1, s + [ms[i]])
def gen_subsets(ms, i=0, s=[]):
if i == len(ms):
yield s
return
for a in gen_subsets(ms, i+1, s): yield a
for a in gen_subsets(ms, i+1, s + [ms[i]]): yield a
t1 = dt.now()
rec_subsets(range(20))
t2 = dt.now()
print t2 - t1
t1 = dt.now()
for _ in gen_subsets(range(20)): pass
t2 = dt.now()
print t2 - t1
以下是输出结果:
0:00:01.027000 # rec_subsets
0:00:02.860000 # gen_subsets
人们自然会期望gen_subsets的速度大约与rec_subsets相同,但事实并非如此,它要慢得多。
这是正常的吗?还是我漏掉了什么?
# do something with s
位置放置一些代码。 - Janne Karila