Tengo un programa de Python que funciona mucho con diccionarios. Tengo que hacer miles de copias de diccionarios. Necesito una copia tanto de las claves como del contenido asociado. La copia será editada y no debe estar vinculada al original (por ejemplo, los cambios en la copia no deben afectar al original).
Las claves son cadenas, los valores son enteros (0/1).
Actualmente utilizo una forma sencilla:
newDict = oldDict.copy()
Perfilar mi Código muestra que la operación de copia lleva la mayor parte del tiempo.
¿Existen alternativas más rápidas al dict.copy()
método? ¿Qué sería más rápido?
python
performance
dictionary
copy
Joern
fuente
fuente
bool
sería una mejor opción que unint
?bool
en Python nombrado deint
todos modos.bool
tipo es en realidad una subclase (¿subtipo?) Delint
tipo.Respuestas:
Mirando la fuente C para las
dict
operaciones de Python , puede ver que hacen una copia bastante ingenua (pero eficiente). Básicamente se reduce a una llamada aPyDict_Merge
:Esto hace las comprobaciones rápidas de cosas como si son el mismo objeto y si tienen objetos en ellos. Después de eso, hace un generoso cambio de tamaño / asignación al dict de destino y luego copia los elementos uno por uno. No veo que vayas mucho más rápido que el incorporado
copy()
.fuente
Aparentemente, dict.copy es más rápido, como dices.
fuente
timeit
's-s
argumento:python -m timeit -s "from copy import copy" "new = copy({1:1, 2:2, 3:3})"
. Mientras lo hace, extraiga también la creación de dict (para todos los ejemplos)¿Puede proporcionar una muestra de código para que pueda ver cómo está usando copy () y en qué contexto?
Podrías usar
Pero no creo que sea más rápido.
fuente
Me doy cuenta de que este es un hilo antiguo, pero este es un resultado alto en los motores de búsqueda para "dict copy python", y el resultado superior para "dict copy performance", y creo que esto es relevante.
Desde Python 3.7,
newDict = oldDict.copy()
es hasta 5,5 veces más rápido que antes. Cabe destacar que, en este momento,newDict = dict(oldDict)
no parece tener este aumento de rendimiento.Hay un poco más de información aquí .
fuente
Dependiendo de las cosas que deje a la especulación, es posible que desee ajustar el diccionario original y hacer una especie de copia por escrito.
La "copia" es entonces un diccionario que busca cosas en el diccionario "padre", si aún no contiene la clave --- pero contiene modificaciones en sí mismo.
Esto supone que no modificará el original y que las búsquedas adicionales no terminan costando más.
fuente
Sin embargo, las medidas dependen del tamaño del diccionario. Para 10000 entradas, copy (d) y d.copy () son casi lo mismo.
fuente