Python:类层次结构中的自定义deepcopy

2024-04-25 15:05:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个表示线性代数表达式(作为表达式树)的类层次结构,类似这样的东西(实际上比那个更复杂,但这应该足以让您有一个想法)。你知道吗

  • 表达式
    • 操作员
    • 符号
      • 矩阵
      • 标量

我用许多不同的方式操纵这些表达式,所以我不得不大量复制这些表达式,因为我想探索操纵它们的不同方式(我真的看不到复制它们的任何方法)。毫不奇怪,copy.deepcopy()很慢。你知道吗

并不是所有的类属性都需要深度复制,而且那些表达式树将始终是树(如果不是,则有些根本上是错误的),因此我可以通过简化记忆来节省一些时间(或者根本不使用它)。你知道吗

我想通过实现一个自定义的复制函数来加快复制速度。这可能意味着实现__deepcopy__(),编写一个全新的函数,或者使用get_stateset_state之类的东西,我真的不在乎。现在,我不在乎腌制。你知道吗

我用的是python3。你知道吗

因为我有这样一个类层次结构,在不同的层次上引入了新的属性,所以我不希望在每个层次上都从头开始。相反,应该重用超类的一些功能,类似于在__init__中调用超类的__init__。但是,我不想调用__init__,因为有时它会做一些复制时不需要的额外工作。你知道吗

我该如何以最快最快的方式来做呢?在这种情况下,我找不到任何关于如何实现此复制功能的合理指导原则。我研究了python2和python3中deepcopy的实现。在Python2中,使用了一系列不同的方法(get_state/set_state,使用__dict__,…),在Python3中,我根本找不到相应的函数。你知道吗


Tags: 方法函数功能get属性层次结构init表达式
1条回答
网友
1楼 · 发布于 2024-04-25 15:05:41

我自己找到了一个可能的解决办法:

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__一直到类层次结构的顶部。我会调查的。你知道吗

相关问题 更多 >