Tôi có cấu trúc cây của tiện ích, ví dụ: bộ sưu tập chứa các mô hình và mô hình chứa các tiện ích con. Tôi muốn sao chép toàn bộ bộ sưu tập, copy.deepcopy
là nhanh hơn so với 'dưa và de-pickle'ing đối tượng nhưng cPickle như được viết bằng C là nhanh hơn nhiều, vì vậycopy.deepcopy vs pickle
- Tại sao tôi (chúng tôi) không nên luôn luôn đang sử dụng cPickle thay vì sâu?
- Có phương án sao chép nào khác không? vì dưa là chậm hơn sau đó deepcopy nhưng cPickle là nhanh hơn, do đó có thể là một thực hiện C deepcopy sẽ là người chiến thắng
mã kiểm tra mẫu:
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))
Thời gian:
>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
Đây là một quan sát rất hữu ích. – bayer
hm, bạn có nên so sánh 'pickle' với' copy.copy' không? – SilentGhost
Nó có phụ thuộc vào cấu trúc của những gì bạn đang sao chép không? Như trong, liệu nó có tạo ra sự khác biệt nếu, giả sử, bộ nhớ được phân bổ cho các đối tượng được sao chép là không liền kề hoặc các con trỏ bên dưới có một chuỗi dài để làm theo? –