早上好,抱歉,如果這是一個模糊的問題。我會盡量保持描述性。試圖提高迭代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知識,並希望能夠更頻繁地運行它,同時更改變量等。
先謝謝您!
爲什麼你轉的'itertools.combinations'結果到一個列表?在這種情況下發電機就足夠了。 –