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

3 投票
3 回答
684 浏览
提问于 2025-04-15 23:14

我现在的工作是写一些需要长时间运行的脚本(可能要几个小时到几天),这些脚本主要是进行大量的计算和数据处理。程序的流程非常简单:它进入主循环,完成主循环,保存输出,然后结束。我的程序基本结构大概是这样的:

<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 个回答

1

使用类(或者多个类)可以帮助你更好地组织代码。简单的结构(比如使用类的属性和方法)很重要,因为这样能让你更清楚地看到你的算法,也能让你更容易地对各个部分进行单元测试。

在我看来,这些好处远远超过了使用面向对象编程(OOP)可能带来的速度稍微下降。

2

虽然有点乱,但在小项目中效果不错...

你可以把模块当成单例来用,只有在模块或计算变得复杂时,才真正创建类。

如果这样做的话,建议使用“import module”而不是“from module import stuff”——这样更简洁,而且如果“stuff”需要重新赋值的话,效果会更好。此外,这也是谷歌的推荐做法。

2

首先,如果你的程序需要运行几个小时或几天,那么把代码分成类和方法,而不是把所有东西都放在一个巨大的主函数里,实际上不会增加太多负担。

另外,重构代码(即使这可能涉及到传递很多变量)从长远来看应该能帮助你提高速度。一个设计良好的应用程序更容易进行性能分析,因为你可以准确找到慢的部分并进行优化。也许会有一个新的库出现,它对你的计算进行了高度优化……一个设计得当的程序会让你轻松地将它接入并立即测试。或者你可能决定写一个C模块扩展,以提高某些计算的速度,设计良好的应用程序也会让这个过程变得简单。

没有看到具体的代码,比如<lots of tightly coupled computation><lots more computation>,很难给出具体的建议。不过,我建议你可以先把每个for循环块单独做成一个方法,然后再继续进行其他改进。

撰写回答