Это , а не , всегда так, что cPickle быстрее, чем deepcopy (). Хотя cPickle, вероятно, всегда быстрее, чем pickle, зависит от того, быстрее ли это, чем Deepcopy,
- размер и уровень вложенности копируемых структур,
- тип содержащихся объектов и
- размер представления маринованной строки.
Если что-то можно мариновать, оно, очевидно, может быть глубоко скопировано, но дело обстоит не так: Для того, чтобы что-то мариновать, оно должно быть полностью сериализовано ; это не относится к глубокому копированию. В частности, вы можете очень эффективно реализовать __deepcopy__
, скопировав структуру в памяти (подумайте о типах расширений), не имея возможности сохранить все на диск. (Подумайте о приостановке на ОЗУ против приостановки на диск.)
Хорошо известный тип расширения, который удовлетворяет указанным выше условиям, может быть ndarray
, и, действительно, он служит хорошим контрпримером к вашему наблюдению: с d = numpy.arange(100000000)
ваш код дает другое время выполнения:
In [1]: import copy, pickle, cPickle, numpy
In [2]: d = numpy.arange(100000000)
In [3]: %timeit pickle.loads(pickle.dumps(d, -1))
1 loops, best of 3: 2.95 s per loop
In [4]: %timeit cPickle.loads(cPickle.dumps(d, -1))
1 loops, best of 3: 2.37 s per loop
In [5]: %timeit copy.deepcopy(d)
1 loops, best of 3: 459 ms per loop
Если __deepcopy__
не реализовано, copy
и pickle
совместно используют общую инфраструктуру (см. copy_reg
модуль, обсуждается в Взаимосвязь между pickle и deepcopy ).