长期运行数据处理python脚本中的程序结构

时间:2010-05-27 13:11:20

标签: python language-agnostic refactoring maintainability

对于我目前的工作,我正在编写一些长时间运行(思考数小时)脚本,这些脚本执行CPU密集型数据处理。程序流程非常简单 - 它进入主循环,完成主循环,保存输出并终止:我的程序的基本结构倾向于这样:

<import statements>
<constant declarations>

<misc function declarations>

def main():
   for blah in blahs():
      <lots of local variables>
      <lots of tightly coupled computation>

      for something in somethings():
          <lots more local variables>
          <lots more computation>

   <etc., etc.>

   <save results>

if __name__ == "__main__":
    main()

这很快就无法管理,所以我想将它重构为更易于管理的东西。我希望在不牺牲执行速度的情况下使其更易于维护。

然而,每个代码块都依赖于大量变量,因此将计算的一部分重构为函数会使参数列表非常快速地失控。我应该将这种代码放入python类中,并将局部变量更改为类变量吗?从概念上讲,将程序转换为类是没有多大意义的,因为该类永远不会被重用,并且每个实例只能创建一个实例。

此类计划的最佳实践结构是什么?我使用的是python,但问题是与语言无关,假设现代的面向对象语言功能。

3 个答案:

答案 0 :(得分:2)

首先,如果你的程序将要运行数小时/天,那么切换到使用类/方法而不是将所有内容放在一个巨大的主程序中的开销几乎不存在。

此外,重构(即使它确实涉及传递大量变量)应该可以帮助您提高长期速度。分析设计良好的应用程序要容易得多,因为您可以精确定位慢速部件并进行优化。也许有一个新的库可以为您的计算进行高度优化......一个精心设计的程序可以让您将其插入并立即进行测试。或者您可能决定编写C模块扩展来提高计算子集的速度,精心设计的应用程序也可以轻松实现。

如果没有看到<lots of tightly coupled computation><lots more computation>,就很难提出具体的建议。但是,我会首先让每个for阻止它自己的方法并从那里开始。

答案 1 :(得分:2)

不太干净,但在小项目中效果很好......

您可以开始使用模块,就像它们是单例实例一样,只有当您感觉到模块的复杂性或计算证明它们合理时才能创建实际类。

如果你这样做,你会想要使用“导入模块”而不是“来自模块导入内容” - 它更干净,如果可以重新分配“东西”,它会更好。此外,它建议在Google指南中使用。

答案 2 :(得分:1)

使用一个或多个类可以帮助您组织代码。 简单的形式(例如通过使用类属性和方法)很重要,因为它可以帮助您查看算法,并且可以帮助您更轻松地对零件进行单元测试。

IMO,这些好处远远超过使用OOP可能带来的轻微速度损失。