【问题标题】:Avoiding nested for loops避免嵌套 for 循环
【发布时间】:2012-06-25 20:20:07
【问题描述】:

我正在尝试使用 python 对另一个代码进行一些参数测试。我需要测试 6 个独立参数,但我需要它们的所有可能组合。

每个参数都有一个最小值、一个最大值和一个需要传递给它的步长值。出现在我脑海中的第一个简单的解决方案是嵌套的 for 循环结构,看起来很可怕,像这样:

for var1 in xrange(min1,max1,step1):
    for var2 in xrange(min2,max2,step2):
        ...
            ...
                ...
                    for var6 in xrange(min6,max6,step6):
                        '''
                        Do something and be icky in the process due
                        to being in the middle of six nested for loops
                        '''

我决定,不!这不能成立。因此,我一直在尝试找出一种递归方式来执行此操作,或者至少不嵌套六次。我真的想不出一个好的计划来做到这一点。对我来说最大的障碍是每个变量都有不同的最小值、最大值和步长值。

到目前为止,我的想法并不是很有帮助。我一直在尝试使一些递归函数工作,但是如果不在函数中嵌套更多 for 循环,我就无法弄清楚。我在这里看到了很多对 itertools.product 的引用,但我也不太清楚如何使它工作。

编辑:我正在做的是创建一个以参数组合命名的目录,使用这些参数编写一个文件,使用该文件运行另一个代码,并分析该代码的输出。除了最后一个循环之外,我实际上在任何 for 循环中都没有做任何事情。很多参数只有 2 个值,有的有 10 个,有的有 3 个……只是有点不同。

【问题讨论】:

  • 在所有这些循环中实际应该做什么?我认为这是最重要的问题 - 有一些语法糖可以隐藏循环(但仍然执行它们),但为了避免嵌套循环,最重要的是了解原始问题
  • @deathApril 是对的:我已经为您提供了一种避免以下循环的方法,但您仍然必须进行所有这些迭代。最好使用不同的算法来避免迭代。
  • 添加了一个编辑来解释我为什么需要这个
  • 重点不在于使用或不使用 for 循环;更重要的是,您可能不了解测试用例数量增加的速度有多快。 6 个设置,每个设置有 10 个可能的值,是一百万个测试用例。
  • 我看到 itertools.product 解决了你的问题。对你有益。当您发现显式嵌套 for 循环和执行嵌套循环的隐藏 C 代码之间的性能差异只能如此之大时,请不要感到惊讶;) PS:实际上,如果您确实发布了性能测试结果,那就太好了: ))

标签: python for-loop


【解决方案1】:

product的使用方法如下:

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

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

或者更简洁一点:

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

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

【讨论】:

  • 不错!正要问一个关于如何做到这一点的问题!
  • 您可以通过将v1, v2, v3... 替换为args 来简化此操作,然后执行icky_thing(*args)
  • 对于python3用户,你应该使用range而不是xrange
【解决方案2】:

你或许可以使用itertools.product: http://docs.python.org/library/itertools.html#itertools.product

类似

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

。 . .只有所有六个变量都在里面。

【讨论】:

    猜你喜欢
    • 2017-08-27
    • 2017-11-11
    • 2020-05-21
    • 2019-12-26
    • 1970-01-01
    • 2021-08-19
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多