在类中编写快速python代码;通过自我论证开销

时间:2015-02-08 15:10:46

标签: python

我是否通过在类中传递self参数来产生开销?

我写了一个用于拟合数据的类。在类中有几个辅助函数,它们共同构成了适合的方程组。方便的是可重用性,我可以做myclass.get_data()my_class.fit_data()等等。但是,我担心我实现代码的方式可能产生开销(一些函数被调用50000次)。 E.g:

以下函数计算我系统中的一个变量:

def get_qs(self,x,cp,cs):
    qs = fsolve(self.make_qs,50.,args = (x,cp,cs))
    return(qs)

它调用make_qs

def make_qs(self,qs,x,cp,cs):
    q0 = x[3*self.n_comp]
    # generates the implicit equation for qs (capacity of salt) 
    denom = self.get_denom(qs,x,cp,cs)
    F = q0*cs/denom - qs
    return(F)

它自己调用get_denom

def get_denom(self,qs,x,cp,cs):
    k = x[0:self.n_comp]
    sigma = x[self.n_comp:2*self.n_comp]
    z = x[2*self.n_comp:3*self.n_comp]
    # calculates the denominator in Equ 14a - 14c (Brooks & Cramer 1992)
    a = (sigma + z)*( k*(qs/cs)**(z-1) )*cp
    denom = np.sum(a) + cs
    return denom

我考虑过在Fortran中编写函数,并将最终结果传递给Python中的cost函数。

1 个答案:

答案 0 :(得分:1)

如果你担心表现,你应该:

  • 描述您的代码。查看哪些功能占用了大部分时间并尝试优化它们(或应用一些优化技巧,查看第三个项目)。
  • 在你的情况下,你特别关注self参数的开销,如果你想要你可以指定@classmethod装饰器来消除self的需要。您现在可以调用您的函数:MyClass.make_qs(*args),...
  • 因为你有计算结果,我认为你应该看到memoization。也许你正在重新计算你已经计算过的东西。 (超过50k的函数调用imo是很昂贵的。)

我认为即使超过50k +的调用,传递self也会产生非常非常非常非常低的开销,因为在Python中查看Web应用程序时,他们使用的不是一个而是使用很多类(使用“自我开销”)他们可以很快地为数十亿的请求提供服务。