长期运行数据处理Python脚本中的程序结构
-
05-10-2019 - |
题
对于我目前的工作,我正在编写一些长期运行的(思考时间到几天)的脚本,以进行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类中,然后将局部变量更改为类变量吗?从概念上讲,将程序变成类并不是很大的TP ME,因为该类永远不会被重复使用,并且每个实例只能创建一个实例。
这种程序的最佳实践结构是什么?我正在使用python,但问题是相对较不平衡的语言,假设是现代面向对象的语言特征。
解决方案
首先,如果您的程序要运行数小时/天,那么切换到使用类/方法的开销而不是将所有内容放入巨型主体中几乎是不存在的。
此外,重构(即使确实涉及通过大量变量)也应帮助您长期提高速度。对设计的应用程序进行分析要容易得多,因为您可以将慢速零件固定并在此处进行优化。也许有一个新的库,它对您的计算进行了高度优化...设计精良的程序将使您立即插入并进行测试。或者,也许您决定编写C模块扩展程序以提高计算子集的速度,设计精良的应用程序也将变得容易。
很难不看到具体建议 <lots of tightly coupled computation>
和 <lots more computation>
. 。但是,我会从每一个开始 for
阻止它自己的方法,然后从那里走。
其他提示
不太干净,但是在小项目中效果很好...
您可以开始使用模块,就好像它们是单例实例一样,并且只有在感觉模块的复杂性或计算证明它们的合理性时才创建真实类。
如果这样做,您将需要使用“导入模块”,而不是“从模块导入物品” - 它更干净,如果可以重新分配“东西”,它将更好地工作。此外,建议在Google指南中使用。
使用类(或类)可以帮助您组织代码。形式的简单性(例如通过使用类属性和方法)很重要,因为它可以帮助您查看算法,并可以帮助您更轻松地对单元进行测试。
IMO,这些好处远远超过使用OOP可能带来的轻微速度损失。