【发布时间】:2013-11-19 01:01:06
【问题描述】:
我可以找到具有 10k 及以上整数的幂集和的最快方法是什么?
long_list = [randrange(0,10000) for r in xrange(10000)]
desired_sum = sum(randint(0,10000)+randint(0,10000)+randint(0,10000))
def powerset(iterable):
# notice the '3' in combinations(s,3), taking all combinations of 3.
s = list(iterable)
return chain.from_iterable(combinations(s, 3) for r in range(len(s)+1))
ps = powerset(set(long_list))
if desired_sum > 29994:
print "cannot compute"
else:
for i in ps:
if sum(i) == desired_sum: # last combination of chain 9999+9998+9997
print i
我的电脑计算时间太长,我想请教一些关于如何处理此类大型组合的提示。
为了像这样进行搜索,我的 for 循环必须在计算组合总和之前耗尽整个列表。
【问题讨论】:
-
你想要的输出到底是什么?如果您的目标是迭代 所有 组合,那么......这很多。如果你只需要其中的一部分,你可以想出一些预处理来修剪初始范围。
-
@shx2 我想要的输出是打印等于我的总和 29994 的组合,但是这个数字会改变。你有什么建议对变量总和值执行预处理修剪?
-
但你已经知道答案了。这是最有效的解决方案:
print (9999,9998,9997) -
@shx2 是的,但它是一个变量,这些数字加起来就是我的总和,我会用它们来生成其他东西
-
同时,您的问题是要求以最快的方式总结您的巨型迭代的所有元素;确实没有比迭代它更快的方法了。 (好吧,您可以并行化或矢量化块以实现 8 倍的改进,但除此之外……)但是是什么让您认为这是做任何事情的有用方法?你到底想做什么?如果只是求总和,你一开始就不需要集合。
标签: python search iterator set combinations