Python: actualizando un diccionario grande usando otro diccionario grande

Estoy tratando de actualizar algunos valores de un diccionario grande usando valores de otro diccionario donde tienen claves similares (la misma fecha pero en un formato diferente). El proceso que estoy usando actualmente es demasiado lento y quiero reducir el cuello de botella.

Esta es mi solución actual (escribe el dictado actualizado en un archivo):

from dateutil import parser File = open(r'E:Test1.txt','w') b = {'1946-1-1':0,..........,'2012-12-31':5} d = {'1952-12-12':5,........,'1994-7-2':10} for key1, val1 in b.items(): DateK1 = parser.parse(key1) Value = val1 for key2, val2 in d.items(): DateK2 = parser.parse(key2) if DateK1 == DateK2: d[key2] = Value Order= sorted(d.items(), key=lambda t: t[0]) for item in Order: File.write('%s,%s\n' % item) File.close() 

Debe utilizar el método de update para combinar diccionarios:

 b.update(d) 

.

En este momento está iterando sobre d para cada tecla en b … lo cual es lento. Puede solucionar esto configurando dos diccionarios que tendrán claves que coincidan (y las fechas iguales tendrán el mismo efecto, tal vez lo mejor de notar aquí es que el hash de los objetos de fecha y hora ):

 b1 = dict( (parser.parse(k),v) for k,v for b.iteritems() ) d1 = dict( (parser.parse(k),v) for k,v for d.iteritems() ) d1.update(b1) # update d1 with the values from b1 

Editar:

Acabo de darme cuenta de que no está realizando una actualización, ya que solo se están actualizando esos valores compartidos, así que en su lugar (de nuevo, solo iterando una vez):

 for k_d1 in d1: if k_d1 in b1: d1[k_d1] = b1[k_d1] 

Cambios sugeridos:

  1. Utilice .iteritems() lugar de .items() . De la forma que lo tiene, se crea una lista de pares en la memoria y se repite, lo que es un desperdicio.
  2. Usted dijo que el formato de fecha es diferente entre b d . Supongo que el mes y el día están cambiados? Si es así, aún puede hacer grandes ahorros al calcular cuál sería la clave d y luego verificar la membresía.

Código con modificaciones:

 def switch_month_day(datestr): fields = datestr.split("-") return "%s-%s-%s" % (fields[0], fields[2], fields[1]) for key, val in b.iteritems(): DateK = switch_month_day(key) if DateK in d: d[DateK] = val