Deepcopy 太慢
问题原因
使用 deepcopy
太慢,是因为 deepcopy
会递归复制对象中的每一个层次的成员,包括所有的嵌套对象。
相比之下,copy
只是进行浅复制,它只复制对象本身和其中包含的引用,而不复制引用指向的对象。
折中解决方法
- 手动实现定制的深复制:实现一个自定义的深复制方法,只复制关心的属性,而不是对象中的每一个属性。
- 使用原型设计模式:设计一个克隆方法,允许克隆对象的当前状态,这可以作为一种定制的深复制解决方案。
- 使用序列化:如果对象可以被序列化,可以通过序列化和反序列化对象来快速地创建深层副本。这通常用JSON或Pickle来实现。
代码示例
序列化和反序列化来进行深复制的简单示例
import copy
import json
class MyObject:
def __init__(self, data):
self.data = data
def __deepcopy__(self, memo):
return json.loads(json.dumps(self, default=lambda o: o.__dict__),
object_hook=lambda d: MyObject(**d))
# 创建一个对象实例
original = MyObject({'a': 1, 'b': 2})
# 使用定制的深复制方法
copied = copy.deepcopy(original)
Pickle
import copy
import pickle
class MyObject:
# ... 类定义 ...
# 创建一个对象实例
original = MyObject()
# 使用pickle来深复制
copied = pickle.loads(pickle.dumps(original))
总结
使用序列化方法可能比 deepcopy
快,尤其是对于那些包含复杂数据结构但不包含不可序列化对象的情况。然而,请注意,不是所有对象都可以序列化,并且对于某些特定类型的对象(如文件,数据库连接等),这种方法不适用。
License:
CC BY 4.0