2014-01-26 14 views
-1

大類的繼承是否需要更多的內存而不是調用類中的特定函數?大類的繼承是否需要更多的內存而不是隻調用類中的特定函數?

例如,拿下面的A類。哪種方法最快,佔用的內存最少?它們是否一樣,只是語法問題還是它實際上有所作爲?

class A(object): 
    def function1(self): 
     code 
    def function2(self): 
     code 
    def function3(self): 
     code 
    def function4(self): 
     code 
    def function5(self): 
     code 

方法1:

class B(A): 
    def function6(self): 
     self.function1(argument) 

方法2:

class B(object): 
    def function6(self): 
     A().function1(argument)  

方法3:

class B(object): 
    def function6(self): 
     A.function1(self,argument) 

在喜好和風格方面,我想要去與方法1,但恐怕如果A類真的很大a nd有許多與B類無關的功能,它會佔用更多的內存,並減慢速度。這是這種情況,還是我可以採用方法1?

+1

如果你不需要一個'A'實例的屬性,爲什麼函數是一個實例方法? – jonrsharpe

回答

5

沒有一個選項比其他選項佔用更多的內存。但是,它們在相同的環境中也沒有意義。

  • 如果你可以打電話A().function1(argument)並有做一些合理的,function1並不需要是一個類的方法都沒有。
  • A.function1(self, argument)沒有任何意義,如果self不是A的實例。如果它A的一個實例,最好使用self.function1(argument)。特別是在Python 2中,如果self不是A的實例,則A.function1(self, argument)將引發TypeError
  • self.function1(argument)是最合理的,但如果你從A繼承只是爲了獲得訪問它的實例方法,你可能要重新考慮你的程序的類和方法的組織方式。
2

這不會改變任何東西,因爲方法是靜態創建(或多或少)(除非您動態創建類)。

實例屬性可能更重要,但從問題我猜這不是這種情況。

只有內存優化(也就是相關的類和對象)是使用slots,但請記住:「不成熟的優化是萬惡之源」,所以不要使用它們,除非碰上記憶性能問題。

1

方法3看起來不對,因爲self不是A的實例。這嚴重限制了您可以使用selffunction1中執行的操作,並且它在Python 2中完全不起作用。

由於您構建了一個對象,方法2的開銷很小。

沒有與功能於一個類的基類(ES)的號碼相關聯的無存儲器的使用或性能開銷。對象使用的內存不會根據其類中的方法數量或其基數而變化,因爲它們在對象本身中未被引用。所以方法1似乎是最好的,只要使用繼承的通常標準適用於AB。如果A具有許多與B不相關的功能,則可能表示通常的標準不適用。不合邏輯的繼承通常是不是的一個很好的性能優化。可能有一些明智的方法可以在不創建對象的情況下調用function1,例如將其作爲類方法。

0

從某種意義上說,A不是一個「大類」,每個實例都絕對沒有實例屬性。因此,從A繼承將爲子類實例添加正好爲零的膨脹。

更重要的是,您的問題代表了一個過早優化的例子。如果你真的有性能問題,你應該剖析你的代碼,看看內存和時間消耗的位置。如果您不這樣做,請儘可能以最簡單的方式編寫代碼。

相關問題