2010-05-27 46 views
3

对于我目前的工作,我正在编写一些长时间运行(想几个小时到几天)的脚本来完成CPU密集型数据处理。该程序流程非常简单 - 它进入到主回路,完成主循环,节省了输出和终止:我的程序的基本结构往往是像这样:长时间运行的数据处理python脚本中的程序结构

<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,但问题是相对语言不可知的,假设一个现代的面向对象的语言功能。

回答

2

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

此外,重构(即使它涉及传递大量变量)应该可以帮助您长期提高速度。对设计良好的应用程序进行性能分析非常容易,因为您可以针对慢速部件进行优化并在其中进行优化。也许一个新的库会随着您的计算高度优化...一个精心设计的程序将让您插入并立即测试。或者,您可能决定编写一个C模块扩展来提高计算子集的速度,一个精心设计的应用程序也可以使这一点变得简单。

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

1

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

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

1

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

您可以开始使用的模块,好像他们是单身的情况下,只有创造真正的类时,你觉得该模块的复杂性和计算证明他们。

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