#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 разных параметров, поэтому он еще более вложенный, чем приведенный выше.
-
Существует ли какая-либо структура для перебора нескольких списков, о которой я не знаю?
-
Если нет, могу ли я реструктурировать списки, чтобы использовать другой подход, сохраняя при этом разборчивость?
Я просмотрел похожие ответы на 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))