python - 在类中编写快速的Python代码;通过 self 论证产生的开销

标签 python

通过在类中传递 self 参数会产生开销吗?

我编写了一个类来拟合我的数据。类内部有几个辅助函数,它们一起形成拟合方程组。方便的是可重用性,我可以做类似 myclass.get_data()my_class.fit_data() 等的事情。但是,我担心我的方式实现我的代码可能会产生开销(某些函数被调用大约 50000 次)。例如:

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

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 中的成本函数。

最佳答案

如果您担心性能,您应该:

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

我认为传递 self 会产生非常非常非常非常非常低的开销,即使对于超过 50k+ 的调用也是如此,因为看看 Python 中的 Web 应用程序,它们使用的不是一个而是很多类( “自身开销”),并且它们可以非常快速地处理数十亿个请求。

关于python - 在类中编写快速的Python代码;通过 self 论证产生的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28395521/

相关文章:

python - 2017年如何在Windows+XAMPP上安装mod_wsgi

python - 在 Django 中对富文本字段使用安全过滤器

python - 可变大小数组匹配

python - 无法按 Pandas 数据框中的时间戳编制索引

python - 如何使用 DictReader 或 Pandas 比较 Python 中两个 CSV 文件的结果? (也可以使用任何其他方法!)

python - Django 验证 m2m 模型字段

python - 根据列表列表中的元素复制列表

python - 使用 Beautifulsoup4 获取父标签中的某些标签

python - 尝试使用 BeautifulSoup 从本地文件收集数据

python - 使用 sys.stdin 中的先前输入进行提示