2015-09-05 38 views
2

早上好,抱歉,如果這是一個模糊的問題。我會盡量保持描述性。試圖提高迭代Python程序的效率

基本上,我使用Python代碼後處理空氣擴散模型的結果來測試不同的情況。我使用Python,因爲它可以在幾秒鐘內迭代結果,而分散軟件需要幾小時。我的問題是,代碼仍然需要幾周才能運行所有場景,而且我想知道是否是由於編程不佳造成的。我不會把整個代碼放在這裏,如果它不相關,那麼我會完成所有步驟。首先,這裏是我的問題的概述:

  • 我已經17個源同時
  • 都扮演每一個源可以有四種不同的排放率,這是其他來源無關。即源#1可以具有發射速率a,b,c或d。正如源#2-#17。
  • 每個來源可以採取兩種狀態之一。我們會稱他們工作或不工作,但在這兩個州都有一個排放率。但是,只有5個來源可以同時工作。這個很重要。

總之,每個來源的排放量是四種排放率以及兩種狀態的函數。因此,每個來源有8種可能的排放情景,並且所有17種來源可以同時處於這些情景中的任何一種。相當多的排列組合!

下面是我目前如何計算結果。我想知道每個狀態組合的最大結果是什麼。如果您熟悉空氣擴散模型,我已經根據1 g/s的排放速率計算了結果,所以我可以按照上面的排放速率對結果進行縮放。

的代碼:

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]