簡體   English   中英

為循環優化嵌套Python?

[英]Optimizing nested Python for loops?

我在優化以下for循環時遇到了一些麻煩。 我研究了map函數,理解表達式以及一些itertools和generators,但是不確定如何對嵌套循環進行優化。 任何幫助或建議,我們將不勝感激。 提前致謝!

請注意,對象體系結構為:

self.variables.parameters.index1/index2/value
self.variables.rate
self.state.num

循環1:

mat1 = np.zeros(m, n)
for idx, variable in enumerate(self.variables):
    for parameter in variable.parameters:
        tracking_idx = parameter.index1 + parameter.index2
        mat1[tracking_idx, idx] = parameter.value

循環2:

mat2 = []
for variable in self.variables:
    rate = variable.rate
    for parameter in variable.parameters:
        if parameter.value < 0 and self.state.num[parameter.index1, parameter.index2] <= 0:
            rate = 0
    mat2.append(rate)

使用numpy標簽,我認為“優化”意味着將這些循環轉換為已編譯的numpy數組表達式。 我認為沒有辦法首先收集所有數據作為numpy數組,這將需要相同的循環。

您有n variables的列表。 每個變量都有一個列表? 參數。 每個參數具有3或4個屬性。

所以

rates = np.array([v.rate for v in variables])
values = np.array([[p.value for p in v.parameters] for v in variables]
index1s = <dito>   (?,n) array
index2s = <dita>   (?,n) array

self.state.num已經是一個二維數組,其大小與index1sindex2s的值范圍兼容。

給定那些1和2d數組,我們應該能夠使用整個數組操作導出mat1mat2 如果? 相對於m較小,並且index1index2的值范圍值得這樣做。 我對您的數據沒有真實感。

===========

您提到the map function, comprehension expressions, and a bit of itertools and generators 這些可以使代碼看起來更簡潔,但速度沒有太大差別。

我演示了列表推導的用法。 這些表達可能更復雜,但通常以可讀性為代價。 我喜歡編寫輔助函數來隱藏細節。 生成器理解可以代替提供給另一個的列表理解。 地圖包含相同的功能。

由於variablesparameters具有屬性,因此我假設您已在類中定義了它們。 您可以編寫將這些屬性提取為簡單列表或數組的方法。

class Variable(....):
   ....
   def get_values(self):
       return [p.value for p in self.parameters]
   def get_rate(self, state):
       rate = self.rate
       for parameter in self.parameters:
            if parameter.value < 0 and                
                state.num[parameter.index1, parameter.index2] <= 0:
            rate = 0
       return rate

values = [v.get_values() for v in variables]
rates = [v.get_rate(self.state) for v in variables]

您甚至可以編寫沒有類結構的輔助函數。

那並沒有加快任何速度。 它只是在對象中隱藏了一些細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM