Доброе утро, извините, если это неопределенный вопрос. Я постараюсь быть максимально описательным.Попытка повысить эффективность итеративной программы Python
В принципе, я использую код Python для последующей обработки результатов из модели дисперсии воздуха для тестирования различных сценариев. Я использую Python, так как он может перебирать результаты за считанные секунды, в то время как программное обеспечение дисперсии занимает несколько часов. Моя проблема заключается в том, что для выполнения всех моих сценариев код будет занимать недели, и мне интересно, не из-за плохого программирования. Я не буду вводить весь код здесь, как много, если это не имеет значения, но я пройду шаги, которые я предпринимаю. Во-первых, вот набросок моей проблемы:
- Я 17 источников все действующие одновременно
- Каждый источник может иметь четыре различных уровня выбросов, которые независим от другого источника. То есть источник №1 может иметь скорость выброса a, b, c или d. Как источник # 2- # 17.
- Каждый источник может принимать одно из двух состояний. Мы будем называть их работающими или не работающими, но в обоих штатах существует уровень выбросов. ОДНАКО, только 5 источников могут работать одновременно. Это важно.
Подводя итог, эмиссия от каждого источника зависит от четырех скоростей излучения, а также от двух состояний. Таким образом, каждый источник имеет 8 возможных сценариев выбросов, и все 17 источников могут быть в любом из этих сценариев одновременно. Довольно много перестановок!
Вот как я сейчас вычисляю результаты. Я хочу знать для каждой комбинации состояний, каков будет максимальный результат. Если вы знакомы с моделированием дисперсии воздуха, я уже рассчитал результаты, основанные на скорости излучения 1 г/с, поэтому я могу масштабировать результаты по показателям выбросов выше.
КОД:
sources = ['1','2',...'17']
emission_rates = ['a','b','c','d']
Source_1_results = [list of values of length x] ## NOTE THAT x is VERY LONG. THESE ARE HUGE ARRAYS (400,000 values)
Source_2_result = [list of values of length x]
.
.
Source_17_results = [list of values of length x]
working_sources = list(itertools.combinations(sources, 5))
source_emission_rate = list(itertools.combinations_with_replacement(emission_rates, 17))
for e in source_emission_rate:
for w in working_sources:
temp_results = []
for num, source in enumerate(sources):
temp_results[num] = [Source_x_result * e * w] ##THIS LINE INVOLVES SOME LOOKUP IN MY CODE TO REFERENCE THE ACTUAL RESULTS AND EMISSIONS ETC.
Я сожалею, если это не достаточно кода. Я могу опубликовать полный код, но опять же, по большей части он просто назначает переменные и т. Д.
Мой вопрос: есть ли более быстрый способ повторить все возможные состояния? Мой код в настоящее время работает, но я имею ограниченное знание python и хотел бы иметь возможность запускать его чаще при изменении переменных и т. Д.
Спасибо заранее!
Почему вы поворачиваете результат 'itertools.combinations' в списке? генератора достаточно в этом случае. –