Total time: 3.46068 s
File: test_deepcopy.py
Function: test at line 15
Line # Hits Time Per Hit % Time Line Contents
==============================================================
15 @profile
16 def test():
17 100 957585 9575.9 27.7 b = deepcopy(a)
18 100 862 8.6 0.0 c = copy(a)
19 100 42295 422.9 1.2 d = ujson.loads(ujson.dumps(a))
20 100 85040 850.4 2.5 e = json.loads(json.dumps(a))
21 100 2323465 23234.7 67.1 f = pickle.loads(pickle.dumps(a, -1))
22 100 51434 514.3 1.5 g = cPickle.loads(cPickle.dumps(a, -1))
我做了一个快速的实验,比较了几个案例中deepcopy/json/ujson的结果,我的结果与@prehive在某些案例中的结果相矛盾,在这里发布了这个小实验:
结果是:
这个小实验的结论是:
time(ujson)<time(json)<time(deepcopy)
time(deepcopy)<time(ujson)<time(json)
因此,这取决于每秒生成的副本数量和处理的词典类型,您更喜欢在deepcopy或ujson之间切换。
实际上,deepcopy非常慢。但我们可以使用json、ujson或cPickle。 我们可以使用json/cPickle转储一个对象,稍后再加载它。 这是我的测试:
我们可以看到,json/ujson/cPickle比deepcopy快,但是pickle。。。
如果创建自己的类来保存这些对象,则可以创建自己的方法来处理复制和深度复制。
http://www.rafekettler.com/magicmethods.html#copying(断开链接)github存储库的新链接https://github.com/RafeKettler/magicmethods
下面是以前断开的链接的类似描述。
复制
有时,特别是在处理可变对象时,您希望能够复制对象并进行更改,而不会影响从中复制的内容。这就是Python的副本发挥作用的地方。然而(幸运的是),Python模块没有感知能力,因此我们不必担心基于Linux的机器人起义,但我们必须告诉Python如何有效地复制东西。
__copy__(self)
为类的实例定义copy.copy()的行为。copy.copy()返回对象的浅层副本——这意味着,当实例本身是一个新实例时,它的所有数据都被引用——即,对象本身被复制,但它的数据仍然被引用(因此浅层副本中的数据更改可能导致原始副本的更改)。
__deepcopy__(self, memodict={})
为类的实例定义copy.deepcopy()的行为。copy.deepcopy()返回对象的深度副本——对象及其数据都被复制。memodict是以前复制的对象的缓存——这优化了复制,并防止在复制递归数据结构时出现无限递归。如果要深入复制单个属性,请对该属性调用copy.deepcopy(),并将memodict作为第一个参数。 这些神奇方法有哪些用例?与往常一样,在任何情况下,您都需要比默认行为提供的更细粒度的控制。例如,如果您试图复制一个将缓存存储为字典的对象(可能很大),那么复制缓存也可能没有意义——如果缓存可以在实例之间的内存中共享,那么它应该是。
相关问题 更多 >
编程相关推荐