Когда нам нужно скопировать полные данные из словаря, содержащего примитивные типы данных (для простоты, игнорировать наличие типов данных, таких как datetime и т.д.), самый очевидный выбор, который у нас есть, заключается в использовании deepcopy
, но глубокая копия медленнее, чем некоторые другие хакерские методы достижения того же, т.е. использование сериализации-несериализации, например json-dump-json-load или msgpack-pack-msgpack-unpack. Разницу в эффективности можно увидеть здесь:
>>> import timeit
>>> setup = '''
... import msgpack
... import json
... from copy import deepcopy
... data = {'name':'John Doe','ranks':{'sports':13,'edu':34,'arts':45},'grade':5}
... '''
>>> print(timeit.timeit('deepcopy(data)', setup=setup))
12.0860249996
>>> print(timeit.timeit('json.loads(json.dumps(data))', setup=setup))
9.07182312012
>>> print(timeit.timeit('msgpack.unpackb(msgpack.packb(data))', setup=setup))
1.42743492126
Методы json и msgpack (или cPickle) быстрее, чем нормальная глубокая копия, что очевидно, поскольку глубокая копия будет делать гораздо больше при копировании всех атрибутов объекта.
Вопрос: Существует ли еще более сложный способ для создания или преобразования данных в словарь или список, не имея всех служебных данных, которые имеют deepcopy?