rec_subsets()依然较快(为
range(20)),即使
result.append(s)添加的就地
# do somethingwith s和两者的结果
gen_subsets()和
rec_subsets()消耗。
PEP 380
yieldfrom的以下引用(语法支持)可能解释了这一点:
当生成器链很长时,使用专门的语法可以进行优化。例如,当递归遍历树结构时,会出现此类链。
__next__()在链中上下传递呼叫和产生值的开销可能导致本来应该是
O(n)的 操作变成最坏的情况,即 O(n 2)** 。
您可以使用生成电源集
itertools.combinations():
from itertools import combinationsdef subsets_comb(lst): return (comb for r in range(len(lst)+1) for comb in combinations(lst, r))
range(20)在我的机器上,速度更快:
name time ratio commentsubsets_comb 227 msec 1.00 [range(0, 20)]subsets_ipowerset 476 msec 2.10 [range(0, 20)]subsets_rec 957 msec 4.22 [range(0, 20)]subsets_gen_pep380 2.34 sec 10.29 [range(0, 20)]subsets_gen 2.63 sec 11.59 [range(0, 20)]
要重现结果,请运行
time-subsets.py。



