Cómo dividir el diccionario en múltiples diccionarios rápidamente

He encontrado una solución pero es muy lenta:

def chunks(self,data, SIZE=10000): for i in xrange(0, len(data), SIZE): yield dict(data.items()[i:i+SIZE]) 

¿Tienes alguna idea sin usar módulos externos (numpy y etc.)

Dado que el diccionario es tan grande, sería mejor mantener todos los elementos involucrados para que sean solo iteradores y generadores, como este

 from itertools import islice def chunks(data, SIZE=10000): it = iter(data) for i in xrange(0, len(data), SIZE): yield {k:data[k] for k in islice(it, SIZE)} 

Ejecución de la muestra:

 for item in chunks({i:i for i in xrange(10)}, 3): print item 

Salida

 {0: 0, 1: 1, 2: 2} {3: 3, 4: 4, 5: 5} {8: 8, 6: 6, 7: 7} {9: 9} 

Otro método es iterando zip

 >>> from itertools import izip_longest, ifilter >>> d = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6, 'g':7, 'h':8} 

Cree una lista con copias de los iteradores de dict (el número de copias es la cantidad de elementos en los resultados). Al pasar cada iterador de la lista de chunks a izip_longest , obtendrá el número necesario de elementos del izip_longest de origen ( ifilter usa para eliminar None de los resultados zip). Con la expresión del generador puede disminuir el uso de memoria:

 >>> chunks = [d.iteritems()]*3 >>> g = (dict(ifilter(None, v)) for v in izip_longest(*chunks)) >>> list(g) [{'a': 1, 'c': 3, 'b': 2}, {'e': 5, 'd': 4, 'g': 7}, {'h': 8, 'f': 6}]