优化所有可能的整数组合

时间:2018-01-24 22:12:03

标签: python iteration combinatorics

假设我有一个由5个整数组成的行向量,其中第一个整数是int1,第二个整数是int2

int1   int2   int3   int4   int5

我希望创建一个所有可能组合的列表,假设每个整数可以在1到99之间。

一种可能性是编写5个嵌套循环:

my list = []

for i in range(1,99):
    for j in range(1,99):
        for k in range(1,99):
            for l in range(1,99):
                for m in range(1,99):
                    my_list.append([[m,l,k,j,i]])

这将是非常低效的,我们需要9,509,900,499次迭代。

是否有更有效的方法将所有可能的组合添加到列表中(即5个嵌套循环的替代方法)?

我将在python中编写代码,但响应不需要特定于python。

2 个答案:

答案 0 :(得分:2)

考虑到这一重要评论,有一个简单的解决方案:

  

是的,我不需要将列表保存在内存中,实际上我可以做到   每个组合的东西都继续前进 - Alejandro Simkievich

您所要做的就是:

import itertools
my_list = itertools.product(xrange(1,99+1), repeat=5)

这在几分之一秒内执行,几乎不占用内存。它实际上并不创建99 ^ 5个整数的列表。实际上,它甚至没有创建99个整数的列表。它假装了所有这些。

即使内存中没有列表,my_list也可以迭代,就好像它就是这样一个列表:

for int1, int2, int3, int4, int5 in my_list:
    # do_whatever, but this will be executed 9509900499 times, of course
    # try e.g.
    print int1, int2, int3, int4, int5

答案 1 :(得分:0)

我刚刚意识到可能有一种方法可以并行加速这些运行。

假设你有一台拥有99个核心的机器,你可以在99个核心上并行运行四个嵌套循环。在99个核心中的每一个核心中,第一个整数是常数。你的效率会提高100倍(实际上我猜的有点少)。

我实际上可以访问具有128个内核的计算机,因此这可能是一个选项。