复制嵌套自定义对象:深度复制的替代方案

Noa*_*art 6 python python-3.x

我正在寻找一个包含类对象列表的类对象的深层副本,每个类对象都有自己的一组内容。这些对象不包含任何比整数和列表更令人兴奋的东西(没有字典,没有等待生成的生成器等)。我正在一个循环中对 500-800 个对象执行深度复制,这确实减慢了程序速度。我意识到这已经是低效了;目前无法更改。

其外观示例:

import random
import copy

class Base:
    def __init__(self, minimum, maximum, length):
        self.minimum = minimum
        self.maximum = maximum
        self.numbers = [random.randint(minimum, maximum) for _ in range(length)]
        # etc

class Next:
    def __init__(self, minimum, maximum, length, quantity):
        self.minimum = minimum
        self.maximum = maximum
        self.bases = [Base(minimum, maximum, length) for _ in range(quantity)]
        # etc
Run Code Online (Sandbox Code Playgroud)

由于我对对象执行的操作,我无法浅复制。我需要新变量拥有的内容:

> first = Next(0, 10, 5, 10)
> second = first
> first.bases[0].numbers[1] = 4
> print(first.bases[0].numbers)
> [2, 4, 3, 3, 8]
> print(second.bases[0].numbers)
> [2, 4, 3, 3, 8]
>
> first = Next(0, 10, 5, 10)
> second = copy.deepcopy(first)
> first.bases[0].numbers[1] = 4
> print(first.bases[0].numbers)
> [8, 4, 7, 9, 9]
> print(second.bases[0].numbers)
> [8, 11, 7, 9, 9]
Run Code Online (Sandbox Code Playgroud)

我尝试了几种不同的方法,例如使用 json 序列化和重新加载数据,但在我的测试中它还不够快,因为我每次都必须重新分配所有变量。self.__dict__ = dct由于嵌套的对象,我试图实现聪明的尝试并没有成功。

关于如何在不使用 copy.deepcopy 的情况下有效地深度复制多重嵌套 Python 对象的任何想法?

Noa*_*art 8

根据这里的珍惜的答案,pickle.loads(pickle.dumps(first))每次调用的速度大约是两倍。由于测试时出现不相关的错误,我最初将其注销,但在重新测试时,它的性能很好,符合我的需求。


Tad*_*sen 5

首先要查找的事情之一copy.deepcopy是对象是否定义了自己的__deepcopy__方法,因此不必让它每次都定义自己的过程来弄清楚如何复制对象。

这需要您有一种方法来定义一个Base没有任何随机元素的对象供副本使用,但是如果您可以找到一种更有效的复制对象的过程,您应该将其定义为一种__deepcopy__加快复制过程的方法。