2010-05-27 45 views
3

對於我目前的工作,我正在編寫一些長時間運行(想幾個小時到幾天)的腳本來完成CPU密集型數據處理。該程序流程非常簡單 - 它進入到主迴路,完成主循環,節省了輸出和終止:我的程序的基本結構往往是像這樣:長時間運行的數據處理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,但問題是相對語言不可知的,假設一個現代的面向對象的語言功能。

回答

2

首先,如果您的程序要運行數小時/天,那麼切換到使用類/方法而不是將所有內容放入巨型主體中的開銷幾乎不存在。

此外,重構(即使它涉及傳遞大量變量)應該可以幫助您長期提高速度。對設計良好的應用程序進行性能分析非常容易,因爲您可以針對慢速部件進行優化並在其中進行優化。也許一個新的庫會隨着您的計算高度優化...一個精心設計的程序將讓您插入並立即測試。或者,您可能決定編寫一個C模塊擴展來提高計算子集的速度,一個精心設計的應用程序也可以使這一點變得簡單。

如果沒有看到<lots of tightly coupled computation><lots more computation>,很難給出具體的建議。但是,我會開始讓每個for阻止它自己的方法,並從那裏開始。

1

使用一個或多個類可以幫助您組織代碼。 簡單的形式(例如通過使用類屬性和方法)非常重要,因爲它可以幫助您查看算法,並且可以幫助您更輕鬆地對單元進行單元測試。

IMO,這些好處遠遠超過了使用OOP可能帶來的輕微速度損失。

1

在小的項目不太乾淨,但效果很好...

您可以開始使用的模塊,好像他們是單身的情況下,只有創造真正的類時,你覺得該模塊的複雜性和計算證明他們。

如果你這樣做,你會想要使用「導入模塊」,而不是「從模塊導入的東西」 - 它更乾淨,如果可以重新分配「東西」會更好。此外,這是在Google指南中推薦的。