2013-02-04 25 views
0

我正在寫一個類,它使用幾個非成員函數(所有返回列表)的結果多次。複製一個函數的結果作爲一個類變量或多次調用它Python

我想知道處理這個問題的標準方式是 - 我最初的想法是寫的線沿線的東西:

class Y_and_Z_matrices(object): 
    def __init__(self, roots_p, roots): 
     self.deltas = deltas(roots) 
     self.deltas_p = deltas(roots_p) 
     self.thetas = thetas(roots) 
     self.thetas_p = thetas_p(roots_p) 
     self.epsilons = epsilons(roots) 
     self.epsilons_p = epsilons(roots_p) 


    def _func_a (self, roots_p, roots, param): 
     #refers to the member variables 

    def _func_b (self, roots_p, roots, param): 
     #refers to the member variables 

    def Ymatrix(self, roots_p, roots): 
     #refers to the member variables 

    def Zmatrix(self, roots_p, roots): 
     #refers to member variables 

我以爲,只有調用該函數一次,而不是多次將更快,但作爲deltas,thetasepsilons函數都很小,我不確定它的問題。

現在我想知道python如何在這種情況下工作,這比在每個函數中調用deltas函數我會使用它們更好嗎?保存列表roots並引用它們而不是將它們傳遞給許多函數會更好嗎?

I.e.什麼是(DIS)改寫上述的優點:

class Y_and_Z_matrices(object): 
    def __init__ (self, roots_p, roots, param): 
     self.roots_p = roots_p 
     self.roots = roots 
     self.param = param 

    def _func_a (self): 
     #uses 'roots_p', 'roots', and 'param' member variables 
     #passes 'roots' and 'roots_p' to 'deltas', 'epsilons' and 'thetas' when needed 

    def _func_b (self): 
     #uses 'roots_p', 'roots', and 'param' member variables 
     #passes 'roots' and 'roots_p' to 'deltas', 'epsilons' and 'thetas' when needed 

    def Ymatrix(self): 
     #uses 'roots_p', and 'roots' member variables 
     #passes 'roots' and 'roots_p' to 'deltas', 'epsilons' and 'thetas' when needed 

    def Zmatrix(self): 
     #uses 'roots_p', and 'roots' member variables 
     #passes 'roots' and 'roots_p' to 'deltas', 'epsilons' and 'thetas' when needed 

我喜歡寫在第二種方式中類,但唯一的原因是因爲我喜歡的功能,以儘可能小的參數列表的外觀儘可能,我不喜歡我的__init__功能看起來如此笨拙。

總結問題: -

它是客觀的更好或更壞到功能的回報保存爲一個成員變量,而不是調用函數在多個成員函數?

保存參數(在整個課程中將保持相同)或者使用所需參數調用函數的客觀上更好還是更差?

或者

難道只是有一個權衡的地方(如果有,在哪裏)?

+0

對我來說似乎很好:你第一次避免計算開銷,特別是如果「希臘字母」的計算是冗長的。但是,爲什麼不在init中分配'roots','roots_p' *和*其他變量到'self'?這避免了方法調用中的額外參數;你可以定義一個私人方法,設置增量等,並從'__init__'調用,如果你發現'__init__'太笨重(我不認爲它是)。 – Evert

+0

這是一個權衡。您必須在初始化程序中花費額外的精力,並編寫額外的代碼行;作爲交換,你會獲得潛在的速度提升。通常的建議是,除非您嘗試修復它們,否則您不應該擔心性能問題。 – katrielalex

+0

感謝你們兩位 - 我應該寫得更清楚的主要觀點是我不確定它會更快,還是我對代碼的工作方式做出錯誤的假設。 – Apple

回答

1

最近版本的Python3有一個很好的解決方案:functools'lru_cache。這個裝飾器允許你讓Python記住一個特定的參數組合的函數調用的結果(這假定如果使用相同的參數,那麼所述函數的結果將是相同的)。

相關問題