【发布时间】:2015-03-20 16:37:09
【问题描述】:
作为 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
例如:
In [1]: list(subsample(6,3,3))
Out [1]: [(0,), (1,), (2,), (3,), (4,), (5,), (0, 1), (0, 2), (1, 2), (1, 3), (2, 3), (3, 4), (2, 4), (4, 5), (3, 5), (0, 1, 2), (1, 2, 3), (2, 3, 4), (3, 4, 5)]
但我坚信必须有更有效的方法来做到这一点。有什么可以让这更快吗?
【问题讨论】:
-
最快的方法是什么? 是一种不好的提问方式。更容易得到答案的是有什么可以让这更快吗?,我会回答除非你想搞砸你的程序的意图.
-
你的 python 版本是多少?
-
您使用的是哪个 Python 版本?这可能与范围有关;如果它是 for p in range(s): 和
for _ in range(0, n-w):中的 xrange@ -
@A.J.如果问题不好,请道歉。我已根据您的建议对其进行了编辑。 @Kasra 和 @Eithos,我使用的是 python 2.7。
rangevsxrange问题是一个很好的观察,谢谢。 -
@STU 如果您将问题发布到here,您可能会得到更好的答案。只是一个建议。
标签: python performance generator combinatorics