Избегание вложенных циклов for для проверки параметров

#python #for-loop

#python #for-цикл

Вопрос:

Я пытаюсь оптимизировать модель, изменяя несколько параметров и запуская модель несколько раз. Пример кода ниже.

 parameter_1 = [1, 2, 3, 4]
parameter_2 = [5, 6, 7, 8]
parameter_3 = [9, 10, 11, 12]

for p1 in parameter_1:
    for p2 in parameter_2:
        for p3 in parameter_3:
            run_model(p1, p2, p3)

  

Это работает нормально, и я согласен с тем, что модель необходимо запускать большое количество раз, от этого никуда не деться. Тем не менее, я хотел бы сделать код более элегантным, если это возможно. На самом деле я меняю 5 разных параметров, поэтому он еще более вложенный, чем приведенный выше.

  1. Существует ли какая-либо структура для перебора нескольких списков, о которой я не знаю?

  2. Если нет, могу ли я реструктурировать списки, чтобы использовать другой подход, сохраняя при этом разборчивость?

Я просмотрел похожие ответы на SE, но они, похоже, предназначены для конкретных случаев, которые здесь не применяются. Прошу прощения, если я пропустил ответ в другом месте.

Комментарии:

1. Нет аккуратного способа избежать того, что вы делаете. Но вы можете переосмыслить модель

2. Не всегда эффективно исследовать все пространство поиска

3. Согласен с обоими вышеперечисленными, но рассматривайте этот подход как набор тестовых параметров для определения путей оптимизации, а не как постоянную структуру. Я не могу придумать альтернативу запуску тестов, не позволяя моим существующим предрассудкам о том, что «должно» быть оптимальным, вступить в игру.

4. Ммм, тогда вам нужно уточнить, что вы подразумеваете под своими «предрассудками» здесь.

5. Я думаю, я вижу ваше желание структурированного теста по сравнению с вещами, которые по своей сути неструктурированы. Вы могли бы установить начальное значение для RNG

Ответ №1:

Если я правильно понимаю, чего вы пытаетесь достичь, вы запускаете функцию во всех возможных вариантах?

Вы пробовали itertools.product ?

 import itertools

parameter_1 = [1, 2, 3, 4]
parameter_2 = [5, 6, 7, 8]
parameter_3 = [9, 10, 11, 12]

for i in itertools.product(parameter_1, parameter_2, parameter_3):
   run_your_function(*i)
  

Ответ №2:

Вы могли бы попробовать использовать itertools для удаления вашей сильно вложенной структуры:

 import itertools

def run_model(a,b,c):
    return a b c

if __name__=='__main__':
    parameter_1 = [1, 2, 3, 4]
    parameter_2 = [5, 6, 7, 8]
    parameter_3 = [9, 10, 11, 12]

    combinations = itertools.product(*[parameter_1, parameter_2, parameter_3])

    for c in combinations:
        print(run_model(*c))