2016-03-04 26 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__一直到类层次结构的顶部。我会调查这一点。