假设我有一个由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。
答案 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个内核的计算机,因此这可能是一个选项。