我希望制作一个包含类对象列表的类对象的深层副本,每个类对象都有自己的一组东西。对象不包含比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对象的任何想法?
答案 0 :(得分:3)
copy.deepcopy
寻找的第一件事是,如果对象定义it's own __deepcopy__
method,那么每次定义自己的过程时,不要弄清楚如何复制对象。
这需要你有一种方法来定义一个Base
对象而没有任何随机元素供副本使用,但是如果你能找到一个更有效的复制对象的过程,你应该将它定义为一种加速复制过程的__deepcopy__
方法。
答案 1 :(得分:1)
根据珍惜的答案here,pickle.loads(pickle.dumps(first))
的效果大约是每次通话的两倍。我最初是因为在测试时出现了无关的错误而将其写下来,但在重新测试时,它在我的需求中表现良好。