2016-03-04 78 views
0

我有一個代表線性代數表達式(作爲表達式樹)的類層次結構,像這樣(它實際上比這更復雜,但這應該足以給你一個想法)。Python:類層次結構中的自定義deepcopy

  • 表達
    • 操作
      • 時報
    • 符號
      • 矩陣

我操縱在許多不同的方式表達者,所以我必須要複製這些表達了很多,因爲我想探索操縱他們不同的方式(我真不」不要以任何方式複製它們)。毫不奇怪,copy.deepcopy()很慢。

不是所有的類屬性都需要進行深層次的處理,而這些表達式樹總是樹(如果不是,根本上是錯誤的),所以我可以通過簡化記憶來節省一些時間(或者不要在所有)。

我想通過實現自定義複製功能來更快地複製。這可能意味着實施__deepcopy__(),寫一個全新的功能或使用類似get_stateset_state,我真的不在乎。目前,我不關心酸洗。

我使用Python 3

因爲我在那裏新的屬性在不同層面介紹了類層次結構,我不希望從每個級別從頭開始。相反,重用超類的某些功能類似於__init__中的方法,通常稱爲超類的__init__將是可取的。不過,我寧願不致電__init__,因爲有時會做一些複製時不需要的額外內容。

我該如何以最快和最pythonic的方式做到這一點?在這種情況下,我無法找到關於如何實現此複製功能的任何合理指導。我研究了Python 2和3中的deepcopy的實現。在Python 2中,Python 3中使用了一堆不同的方法(get_state/set_state,使用__dict__,...),但我無法找到相應的函數在所有。

回答

1

我發現自己一個可能的解決方案:

class Expression(object): 
    ... 
    def __deepcopy__(self, memo): 
     cpy = object.__new__(type(self)) 
     # manually copy all attributes of Expression here 
     return cpy 

class Operator(Expression): 
    ... 
    def __deepcopy__(self, memo): 
     cpy = Expression.__deepcopy__(self, memo) 
     # manually copy all attributes exclusive to Operator here 
     return cpy 

新對象在Expression__deepcopy__始終創建。通過使用object.__new__(type(self)),新對象具有最初調用__deepcopy__的對象的類型(例如Operator)。

不幸的是,這個解決方案並沒有比默認的deepcopy快得多。我想知道是否這是因爲所有這些調用__deepcopy__一直到類層次結構的頂部。我會調查這一點。