作为python中一个大型项目的一部分,我需要一个快速生成器函数来生成所有可能的小于n
的非负整数集,这样每个集合最多有s
个元素,并且集合中最大和最小数字之间的差小于w
。在
到目前为止,我实现的最快的实现是使用itertools
:
import itertools
def subsample(n, s, w):
nn = range(w)
for p in range(s):
o = list(itertools.combinations(nn, p+1))
for t in o:
yield t
for _ in range(0, n-w):
pt = o
o = [tuple([op + 1 for op in list(u)]) for u in pt]
for t in list((set(o) ^ set(pt)) & set(o)):
yield t
例如:
^{pr2}$但我相信,必须有更有效的方法来做到这一点。有什么能让这更快的吗?在
下面是一些基于Knuth算法的生成器。在
subsets4
生成1..n具有k或更少元素的所有子集subsets5
将subsets4
生成的子集限制为最大差wsubsets
生成1..n长度正好k的所有子集subsets2
将subsets
生成的子集限制为最大差w运行
megatest()
函数来测试subsets5
生成器是否存在多个n、k和w的多个值。在相关问题 更多 >
编程相关推荐