我有一個小部件的樹形結構,例如集合包含模型和模型包含小部件。我想複製整個集合,copy.deepcopy
相比更快,以「泡菜和去pickle'ing的對象,而是作爲cPickle的被用C寫的要快得多,所以copy.deepcopy vs pickle
- 爲什麼我不應該(我們)總是使用cPickle而不是deepcopy?
- 是否有其他複製替代方案?因爲泡菜是慢然後deepcopy的,但是cPickle的速度更快,所以可能是一個C實現deepcopy的將是贏家
樣品測試代碼:
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
這是一個非常有用的觀察。 – bayer 2009-09-11 12:56:07
hm,難道你不應該將'pickle'與'copy.copy'比較嗎? – SilentGhost 2009-09-11 12:59:39
它是否完全依賴於你正在複製的結構?如在中,如果分配給複製對象的內存不連續或者底層指針有很長的鏈要遵循,它是否會產生影響? – 2009-09-11 13:24:23