Быстрый способ скопировать словарь в Python - PullRequest
88 голосов
/ 02 мая 2011

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

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

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

newDict = oldDict.copy()

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

Существуют ли более быстрые альтернативы методу dict.copy()?Что будет самым быстрым?

Ответы [ 6 ]

62 голосов
/ 02 мая 2011

Глядя на источник C для операций Python dict, вы можете видеть, что они делают довольно наивное (но эффективное) копирование. По сути, это сводится к вызову PyDict_Merge:

PyDict_Merge(PyObject *a, PyObject *b, int override)

Это делает быструю проверку таких вещей, как, если они являются одним и тем же объектом, и если у них есть объекты в них. После этого он выполняет щедрое однократное изменение размера / выделения для целевого dict, а затем копирует элементы один за другим. Я не вижу, что вы получаете намного быстрее, чем встроенный copy().

54 голосов
/ 02 мая 2011

Кажется, что dict.copy быстрее, как вы говорите.

[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
12 голосов
/ 02 мая 2011

Можете ли вы предоставить пример кода, чтобы я мог видеть, как вы используете copy () и в каком контексте?

Вы можете использовать

new = dict(old)

Но я не думаю, что это будет быстрее.

3 голосов
/ 17 апреля 2018

Я понимаю, что это старый поток, но это высокий результат в поисковых системах для "dict copy python" и лучший результат для "dict copy performance", и я считаю, что это актуально.

В Python 3.7 newDict = oldDict.copy() до 5,5 раз быстрее, чем раньше. Примечательно, что сейчас newDict = dict(oldDict), похоже, не имеет такого увеличения производительности.

Здесь немного больше информации здесь .

3 голосов
/ 02 мая 2011

В зависимости от того, что вы оставляете для размышления, вы можете обернуть исходный словарь и сделать сортировку копирование при записи.

«Копия» - это тогда словарькоторый ищет вещи в «родительском» словаре, если он еще не содержит ключа, но содержит модификации в себе.

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

2 голосов
/ 20 сентября 2015

Измерения зависят от размера словаря.Для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...