[英]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
已經是一個二維數組,其大小與index1s
和index2s
的值范圍兼容。
給定那些1和2d數組,我們應該能夠使用整個數組操作導出mat1
和mat2
。 如果?
相對於m
較小,並且index1
和index2
的值范圍值得這樣做。 我對您的數據沒有真實感。
===========
您提到the map function, comprehension expressions, and a bit of itertools and generators
。 這些可以使代碼看起來更簡潔,但速度沒有太大差別。
我演示了列表推導的用法。 這些表達可能更復雜,但通常以可讀性為代價。 我喜歡編寫輔助函數來隱藏細節。 生成器理解可以代替提供給另一個的列表理解。 地圖包含相同的功能。
由於variables
和parameters
具有屬性,因此我假設您已在類中定義了它們。 您可以編寫將這些屬性提取為簡單列表或數組的方法。
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.