【发布时间】:2010-11-27 11:49:04
【问题描述】:
我有一个小部件的树形结构,例如集合包含模型,模型包含小部件。我想复制整个集合,copy.deepcopy 与 'pickle and de-pickle' 对象相比更快,但 cPickle 用 C 编写要快得多,所以
- 为什么我(我们)不应该总是使用 cPickle 而不是 deepcopy?
- 还有其他的复制选择吗?因为 pickle 比 deepcopy 慢,但 cPickle 更快,所以 deepcopy 的 C 实现可能会是赢家
示例测试代码:
import copy
import pickle
import cPickle
class A(object): pass
d = {}
for i in range(1000):
d[i] = A()
def copy1():
return copy.deepcopy(d)
def copy2():
return pickle.loads(pickle.dumps(d, -1))
def copy3():
return cPickle.loads(cPickle.dumps(d, -1))
时间安排:
>python -m timeit -s "import c" "c.copy1()"
10 loops, best of 3: 46.3 msec per loop
>python -m timeit -s "import c" "c.copy2()"
10 loops, best of 3: 93.3 msec per loop
>python -m timeit -s "import c" "c.copy3()"
100 loops, best of 3: 17.1 msec per loop
【问题讨论】:
-
这是一个非常有用的观察结果。
-
hm,您不应该将
pickle与copy.copy进行比较吗? -
它是否完全取决于您正在复制的内容的结构?例如,如果分配给复制对象的内存是不连续的,或者底层指针有一条长链要遵循,这会有所不同吗?
-
@SilentGhost,pickle 做了一个深拷贝