代码之家  ›  专栏  ›  技术社区  ›  fmark

长时间运行的数据处理python脚本中的程序结构

  •  3
  • fmark  · 技术社区  · 14 年前

    对于我目前的工作,我正在编写一些执行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,但问题是语言不可知论,假定它具有现代面向对象的语言特性。

    3 回复  |  直到 14 年前
        1
  •  2
  •   derivation    14 年前

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

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

    没有看到就很难给出具体的建议 <lots of tightly coupled computation> <lots more computation> . 但是,我会从制作 for 阻止它自己的方法,然后从那里开始。

        2
  •  2
  •   Marco Mariani    14 年前

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

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

    如果您这样做,您将希望使用“导入模块”,而不是“从模块导入内容”--如果可以重新分配“内容”,它会更干净,效果更好。此外,它是在谷歌指南中推荐的。

        3
  •  1
  •   unutbu    14 年前

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

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