コレクションにはモデルが含まれ、モデルにはウィジェットが含まれるなど、ウィジェットのツリー構造があります。コレクション全体をコピーしたいのですcopy.deepcopy
が、オブジェクトを「ピクルしてピクル解除」するよりも高速ですが、C で記述されている cPickle の方がはるかに高速です。
- deepcopy の代わりに常に cPickle を使用すべきではないのはなぜですか?
- 他のコピーの代替手段はありますか?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