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

时间:2016-08-18 23:25:20

标签: python python-3.x

我希望制作一个包含类对象列表的类对象的深层副本,每个类对象都有自己的一组东西。对象不包含比int和列表更令人兴奋的东西(没有dicts,没有等待产生的生成器等)。我在循环中对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

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

> 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]

我尝试了几种不同的方式,例如使用json序列化和重新加载数据,但在我的测试中,它的速度还不够快,因为我不能重新分配所有数据每次变量。由于嵌套对象,我尝试拔出聪明的self.__dict__ = dct并没有效果。

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

2 个答案:

答案 0 :(得分:3)

copy.deepcopy寻找的第一件事是,如果对象定义it's own __deepcopy__ method,那么每次定义自己的过程时,不要弄清楚如何复制对象。

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

答案 1 :(得分:1)

根据珍惜的答案herepickle.loads(pickle.dumps(first))的效果大约是每次通话的两倍。我最初是因为在测试时出现了无关的错误而将其写下来,但在重新测试时,它在我的需求中表现良好。