2015-09-05 3 views
2

Доброе утро, извините, если это неопределенный вопрос. Я постараюсь быть максимально описательным.Попытка повысить эффективность итеративной программы 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 и хотел бы иметь возможность запускать его чаще при изменении переменных и т. Д.

Спасибо заранее!

+1

Почему вы поворачиваете результат 'itertools.combinations' в списке? генератора достаточно в этом случае. –

ответ

1

это должно идти немного быстрее (меньше промежуточный список + список понимание)

working_sources = itertools.combinations(sources, 5) 
source_emission_rate = itertools.combinations_with_replacement(emission_rates, 17) 

for e in source_emission_rate: 
    for w in working_sources: 
     temp_results = [source * e * w for source in sources] 
Смежные вопросы