Django: ¿Usar count() o len() en un QuerySet?

En una revisión de código reciente, me dejaron un comentario pidiendo que cambiara un len() por un count() para obtener el número de filas. Como soy novato en ORM y Django, busqué un poco en StackOverflow y vi que casi todo el mundo recomienda usar count para verificar las filas. Vamos a ver por qué.
Supongamos que queremos saber el número de usuarios (User) actuales de mi servicio.
(Cuidado: si haces esto por diversión en un lugar con millones de usuarios, los chicos de DevOps de la empresa te van a llamar la atención).
qs = User.objects.all()\n\n# Hay una forma de usar count() en el queryset.\ndef user_count_by_count():\n return qs.count()\n\n# Forma de verificarlo con len()\ndef user_count_by_len():\n return len(qs)En este caso, con count(), se ejecutará SELECT COUNT(*) FROM User en el RDBMS y el valor del conteo se enviará a Python.
En el caso de len(), se ejecutará SELECT * FROM User una vez en el RDBMS y el resultado enviado a Python se contará usando len().
A menudo se dice que si necesitas contar filas, uses count(). La razón es que si intentas sustituirlo con len(), el tiempo de fetch tomará O(N). Además, al guardar este resultado en la memoria del servidor web, se genera un O(N) en almacenamiento, y debido al tiempo que tarda en copiarse, se añade otro O(N) en tiempo. A eso hay que sumarle el tiempo que tarda en ejecutarse el propio len(). Aunque estos dos procesos dependen de la infraestructura, se dice que count es aproximadamente el doble de rápido.
Sin embargo, hay ocasiones en las que usar len() es más ventajoso que count.
qs = User.objects.all()\n\ndef prefer_len_to_count():\n # Supongamos que hay un campo telephone en la información de User y recopilamos esa información en una lista.\n telephones = [p.telephone for p in qs]\n # Hacemos algo con esa información...\n ...\n # Obtenemos la cantidad de qs (imagina el uso que le darías)\n len(qs)En una situación como la anterior, donde haces fetch del queryset para usarlo, len es un poquito más ventajoso. La razón es que, en el caso de count(), tendrías que acceder al RDBMS dos veces (una para el fetch y otra para el count()).
Aunque los chicos de DevOps me regañen por decir esto, si no vas a contar una cantidad enorme de filas (este criterio varía mucho según la infraestructura), puedes usar count sin problema.
Por supuesto, en los templates también se recomienda el uso de count.
El count de abajo
{{ some_queryset.count }}es más recomendable que el len de abajo.
{{ len(some_queryset) }}Referencia: stackoverflow.com/questions/14327036/count-vs-len-on-a-django-queryset