在Python3.6中,假设我有一个数字列表L
,并且我想找到给定预先选择长度|S|
的所有可能的子列表S
,这样:
S
的长度都必须小于L
,即|S| < |L|
S
只能包含L
中的数字S
中的数字不必是唯一的(它们可以重复出现)S
中所有数字的总和应等于预先确定的数字N
使用笛卡尔积和itertools.product
可以找到一个简单的解决方案。例如,假设L
是1到10(包括1和10)之间所有整数的简单列表,|S|
被选择为3。然后:
import itertools
L = range(1,11)
N = 8
Slength = 3
result = [list(seq) for seq in itertools.product(L, repeat=Slength) if sum(seq) == N]
然而,当选择较大的列表L
和或较大的|S|
时,上述方法变得非常缓慢。事实上,即使对L = range(1,101)
和|S|=5
和N=80
来说,计算机几乎冻结,计算结果也需要大约一个小时。你知道吗
我的看法是:
N
,在这种情况下,有许多不必要的计算正在进行itertools.product
生成的数百万个列表进行迭代,从而只保留少得多的数据,因此会出现大量的缓存未命中所以,我的问题/挑战是:有没有一种方法可以更有效地计算?除非我们讨论的是数百千兆字节,否则对我来说,速度比内存更为关键,因此,尽管考虑到内存效率是一个受欢迎的奖励,但挑战更多地集中在速度上。你知道吗
因此,给定一个输入列表和一个目标长度和总和,您需要输入列表中所有数字的排列:
以下代码应该更快:
相关问题 更多 >
编程相关推荐