为循环优化嵌套Python?
我在优化以下for循环时遇到了一些问题。我已经研究了map函数、理解表达式以及一些itertools和生成器,但不确定如何对嵌套循环进行优化。非常感谢您的帮助或建议。提前谢谢 请注意,对象体系结构是:为循环优化嵌套Python?,python,numpy,for-loop,optimization,nested,Python,Numpy,For Loop,Optimization,Nested,我在优化以下for循环时遇到了一些问题。我已经研究了map函数、理解表达式以及一些itertools和生成器,但不确定如何对嵌套循环进行优化。非常感谢您的帮助或建议。提前谢谢 请注意,对象体系结构是: self.variables.parameters.index1/index2/value self.variables.rate self.state.num 循环1: mat1 = np.zeros(m, n) for idx, variable in enumerate(self.vari
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)
mat2=[]
对于self.variables中的变量:
速率=可变速率
对于variable.parameters中的参数:
如果parameter.value<0且self.state.num[parameter.index1,parameter.index2]带有numpy
标记,则我假设“优化”意味着将这些循环转换为编译的numpy数组表达式。我认为没有办法不首先收集所有数据作为numpy数组,这将需要相同的循环
您有一个n
变量列表。每个变量都有一个?
参数列表。每个参数都有3或4个属性
所以
您甚至可以在没有类结构的情况下编写这些helper函数
这不会加速任何事情;它只是隐藏了对象中的一些细节。对于第二个循环,如果有大量参数,在rate=0语句后添加一个中断可能会有所帮助,因为它会停止检查其他参数hanks!我对mat1使用了列表理解,并为mat2保留了for循环。它减少了20%左右的运行时间!
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
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]