试图提高迭代Python程序的效率

时间:2015-09-05 14:32:25

标签: python iteration

早上好,如果这是一个模糊的问题,对不起。我会尝试尽可能具有描述性。

基本上,我使用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 个答案:

答案 0 :(得分: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]