长期运行数据处理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,但这个问题在语言上是比较通用的,假设使用的是现代的面向对象编程语言。
3 个回答
使用类(或者多个类)可以帮助你更好地组织代码。简单的结构(比如使用类的属性和方法)很重要,因为这样能让你更清楚地看到你的算法,也能让你更容易地对各个部分进行单元测试。
在我看来,这些好处远远超过了使用面向对象编程(OOP)可能带来的速度稍微下降。
虽然有点乱,但在小项目中效果不错...
你可以把模块当成单例来用,只有在模块或计算变得复杂时,才真正创建类。
如果这样做的话,建议使用“import module”而不是“from module import stuff”——这样更简洁,而且如果“stuff”需要重新赋值的话,效果会更好。此外,这也是谷歌的推荐做法。
首先,如果你的程序需要运行几个小时或几天,那么把代码分成类和方法,而不是把所有东西都放在一个巨大的主函数里,实际上不会增加太多负担。
另外,重构代码(即使这可能涉及到传递很多变量)从长远来看应该能帮助你提高速度。一个设计良好的应用程序更容易进行性能分析,因为你可以准确找到慢的部分并进行优化。也许会有一个新的库出现,它对你的计算进行了高度优化……一个设计得当的程序会让你轻松地将它接入并立即测试。或者你可能决定写一个C模块扩展,以提高某些计算的速度,设计良好的应用程序也会让这个过程变得简单。
没有看到具体的代码,比如<lots of tightly coupled computation>
和<lots more computation>
,很难给出具体的建议。不过,我建议你可以先把每个for
循环块单独做成一个方法,然后再继续进行其他改进。