3

对于我目前的工作,我正在编写一些长时间运行(考虑数小时到数天)的脚本,这些脚本执行 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,但假设现代面向对象的语言特性,这个问题相对语言无关。

4

3 回答 3

2

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

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

如果你这样做,你会想要使用“import module”而不是“from module import stuff”——如果可以重新分配“stuff”,它会更干净,效果会更好。此外,它在 Google 指南中被推荐。

于 2010-05-27T14:56:14.493 回答
2

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

此外,从长远来看,重构(即使它确实涉及传递大量变量)应该可以帮助您提高速度。分析设计良好的应用程序要容易得多,因为您可以查明慢速部分并在那里进行优化。也许会出现一个针对您的计算进行了高度优化的新库……精心设计的程序可以让您立即插入并进行测试。或者,也许您决定编写一个 C 模块扩展来提高计算子集的速度,一个设计良好的应用程序也会使这变得容易。

<lots of tightly coupled computation>没有看到和很难给出具体的建议<lots more computation>。但是,我会从让每个for块都有自己的方法开始,然后从那里开始。

于 2010-05-27T13:46:58.080 回答
1

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

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

于 2010-05-27T13:35:08.710 回答