为循环优化嵌套Python?

为循环优化嵌套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

我在优化以下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.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]