¿Cómo puedo acelerar la iteración de grandes conjuntos de datos en Django?

Tengo un conjunto de consultas de aproximadamente 1500 registros de una consulta ORM de Django. He utilizado los métodos select_related () y only () para asegurarme de que la consulta sea estricta. También he usado connection.queries para asegurarme de que solo hay una consulta. Es decir, me he asegurado de que no se realicen consultas adicionales en cada iteración.

Cuando ejecuto la consulta, corte y pegue desde connection.queries se ejecuta en 0.02 segundos. Sin embargo, se tarda siete segundos en iterar sobre esos registros y no hacer nada con ellos (pasar).

¿Qué puedo hacer para acelerar esto? ¿Qué causa esta lentitud?

Un QuerySet puede ser bastante pesado cuando está lleno de objetos modelo. En situaciones similares, he usado el método .values ​​en el queryset para especificar las propiedades que necesito como una lista de diccionarios, lo que puede ser mucho más rápido para iterar. http://docs.djangoproject.com/en/1.3/ref/models/querysets/#values-list

1500 registros está lejos de ser un gran conjunto de datos, y siete segundos es realmente demasiado. Probablemente haya algún problema en sus modelos, puede verificarlo fácilmente obteniendo (como dice Brandon) la consulta de valores (), y luego crear explícitamente el objeto 1500 mediante la iteración del diccionario. Simplemente convierta ValuesQuerySet en una lista antes de la construcción para factorizar la conexión db.

¿Cómo estás iterando sobre cada elemento:

items = SomeModel.objects.all() 

Regular para bucle en cada

 for item in items: print item 

O usando el iterador QuerySet

 for item in items.iterator(): print item 

Según el documento, el iterator() puede mejorar el rendimiento. Lo mismo se aplica cuando se repite una lista de Python o diccionarios muy grandes, es mejor usar iteritems() .

¿La statement Meta su modelo le dice que “ordene por” un campo que se almacena en alguna otra tabla relacionada? Si es así, su bash de iterar podría estar generando 1,500 consultas a medida que Django se ejecuta y toma ese campo para cada elemento, y luego las ordena. ¡Mostrarnos tu código nos ayudaría a resolver el problema!