您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python递归生成器性能

Python递归生成器性能

rec_subsets()依然较快(为range(20)),即使result.append(s)添加的就地# do something with s和两者的结果gen_subsets()rec_subsets()消耗。

PEP 380yield from的以下引用语法支持)可能解释了这一点:

生成器链很长时,使用专门的语法可以进行优化。例如,当递归遍历树结构时,会出现此类链。__next__()在链中上下传递呼叫和产生值的开销可能导致本来应该是 操作变成最坏的情况,即 2)** 。

您可以使用生成电源集itertools.combinations()

from itertools import combinations

def subsets_comb(lst):
    return (comb for r in range(len(lst)+1) for comb in combinations(lst, r))

range(20)在我的机器上,速度更快:

name                    time ratio comment
subsets_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

python 2022/1/1 18:52:59 有344人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶