Быстрый способ, чтобы скопировать словарь в Python
у меня есть программа Python, которая много работает со словарями. Мне приходится делать копии словарей тысячи раз. Мне нужна копия как ключей, так и связанного с ними содержимого. Копия будет отредактирована и не должна быть связана с оригиналом (например, изменения в копии не должны влиять на оригинал.)
ключи-это строки, значения-целые числа (0/1).
в настоящее время я использую простой способ:
newDict = oldDict.copy()
профилирование моего кода показывает, что операция копирования занимает большую часть времени.
есть ли более быстрые альтернативы dict.copy()
способ? Что будет быстрее всего?
6 ответов:
смотреть на!--5-- > источник C для Python
dict
операции, вы можете видеть, что они делают довольно наивную (но эффективную) копию. Это по существу сводится к вызовуPyDict_Merge
:PyDict_Merge(PyObject *a, PyObject *b, int override)
это делает быстрые проверки для таких вещей, как если бы они были одним и тем же объектом, и если у них есть объекты в них. После этого он делает щедрый одноразовый размер/выделение в целевой dict, а затем копирует элементы один за другим. Я не вижу, что вы получаете намного быстрее, чем встроенный
copy()
.
Appearantly дикт.копирование происходит быстрее, как вы говорите.
[utdmr@utdmr-arch ~]$ python -m timeit -s "d={1:1, 2:2, 3:3}" "new = d.copy()" 1000000 loops, best of 3: 0.238 usec per loop [utdmr@utdmr-arch ~]$ python -m timeit -s "d={1:1, 2:2, 3:3}" "new = dict(d)" 1000000 loops, best of 3: 0.621 usec per loop [utdmr@utdmr-arch ~]$ python -m timeit -s "from copy import copy; d={1:1, 2:2, 3:3}" "new = copy(d)" 1000000 loops, best of 3: 1.58 usec per loop
можете ли вы предоставить пример кода, чтобы я мог видеть, как вы используете copy() и в каком контексте?
вы могли бы использовать
new = dict(old)
но я не думаю, что это будет быстрее.
в зависимости от того, что вы оставляете для спекуляции, вы можете обернуть исходный словарь и сделать вроде копирование при записи.
"копия" - это словарь, который ищет материал в" Родительском " словаре, если он еще не содержит ключ-но сам по себе содержит модификации.
Это предполагает, что вы не будете изменять оригинал и что дополнительные поиски не будут стоить больше.
Я понимаю, что это старый поток, но это высокий результат в поисковых системах для "dict copy python", и верхний результат для "dict copy performance", и я считаю, что это актуально.
Из Python 3.7,
newDict = oldDict.copy()
до 5.5 x быстрее, чем это было ранее. Примечательно, что прямо сейчас,newDict = dict(oldDict)
не похоже, что это увеличение производительности.есть немного больше информации здесь.
измерения зависят от размера словаря, хотя. Для 10000 записей copy (d) и d.copy () почти одинаковы.
a = {b: b for b in range(10000)} In [5]: %timeit copy(a) 10000 loops, best of 3: 186 µs per loop In [6]: %timeit deepcopy(a) 100 loops, best of 3: 14.1 ms per loop In [7]: %timeit a.copy() 1000 loops, best of 3: 180 µs per loop