Быстрый способ, чтобы скопировать словарь в Python


у меня есть программа Python, которая много работает со словарями. Мне приходится делать копии словарей тысячи раз. Мне нужна копия как ключей, так и связанного с ними содержимого. Копия будет отредактирована и не должна быть связана с оригиналом (например, изменения в копии не должны влиять на оригинал.)

ключи-это строки, значения-целые числа (0/1).

в настоящее время я использую простой способ:

newDict = oldDict.copy()

профилирование моего кода показывает, что операция копирования занимает большую часть времени.

есть ли более быстрые альтернативы dict.copy() способ? Что будет быстрее всего?

6 87

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