python 避免嵌套的for循环

5sxhfpxr  于 2023-03-11  发布在  Python
关注(0)|答案(3)|浏览(242)

我尝试反复测试其他一些Python代码,使用六个不同参数的所有可能的值组合,对于每个参数,我都想用给定的最小值、最大值和步长在一个范围内迭代。
我设法写了一些代码如下:

for var1 in range(min1, max1, step1):
    for var2 in range(min2, max2, step2):
        for var3 in range(min3, max3, step3):
            for var4 in range(min4, max4, step4):
                for var5 in range(min5, max5, step5):
                    for var6 in range(min6, max6, step6):
                        do_something_with(var1, var2, var3, var4, var5, var6)

但是我不喜欢代码嵌套得这么深。
我怎样才能避免嵌套多个循环?可以用递归实现吗?itertools.product怎么样?我不知道这两种方法。
更一般地,另见:Get the cartesian product of a series of lists?
这个问题和一些答案最初显示的是Python 2.x的代码,它已经被编辑过了,因为Python 3.x中仍然存在这个基本问题,但是xrange已经不存在了--range是一个替代品,更多信息,请参见What is the difference between range and xrange functions in Python 2.X?

8ftvxx2r

8ftvxx2r1#

下面介绍如何使用product

x1 = range(min1, max1, step1)
x2 = range(min2, max2, step2)
x3 = range(min3, max3, step3)
...

for v1, v2, v3, v4, v5, v6 in itertools.product(x1, x2, x3, x4, x5, x6):
    do_something_with(v1, v2, v3, v4, v5, v6)

或者更简洁一点:

ranges = [
    range(min1, max1, step1),
    range(min2, max2, step2),
    range(min3, max3, step3),
    ...
]

for v1, v2, v3, v4, v5, v6 in itertools.product(*ranges):
    do_something_with(v1, v2, v3, v4, v5, v6)
1qczuiv0

1qczuiv02#

您可能会使用itertools.product

for var1, var2 in itertools.product(range(min1, max1, step1), range(min2, max2, step2)):
    # stuff

但是六个VAR都在里面。

zvms9eto

zvms9eto3#

可以使用multiprocessingitertools.product来加速和简化代码

import itertools
from multiprocessing import Pool

ranges = [
    range(min1,max1,step1),
    range(min2,max2,step2),
    range(min3,max3,step3),
    ...
]

with Pool(os.cpu_count()-2) as p:
    result = p.map(your_op_func, itertools.product(*ranges))
  1. multiprocessing可以加速您的任务(因为它是互斥任务)
  2. itertools.product可以帮助您通过更有效的方式获得组合

相关问题