Le Moyen le plus Efficace pour obtenir la liste des valeurs de Django Queryset
Je peux voir quelques différentes options pour faire, et comme certains commentaires sur le plus efficace ou des "meilleures pratiques" de la méthode.
- Je obtenir un Django Queryset avec filtre()
c_layer_points = models.layer_points.objects.filter(location_id=c_location.pk,season_id=c_season.pk,line_path_id=c_line_path.pk,radar_id=c_radar.pk,layer_id__in=c_layer_pks,gps_time__gte=start_gps,gps_time__lte=stop_gps)
Ce queryset pourrait être très grandes (des centaines de milliers de lignes).
Maintenant, ce qui doit arriver est une conversion de listes et de l'encodage JSON.
Options (que j'ai vu dans mes recherches):
- Boucle sur le queryset
Exemple:
gps_time = [lp.gps_time for lp in c_layer_points];
twtt = [lp.twtt for lp in c_layer_points];
- Valeurs d'usage() ou values_list()
- Utilisation iterator()
À la fin, je voudrais encoder en json quelque chose comme ce format:
{'gps_time':[list of all gps times],'twtt',[list of all twtt]}
Tous les conseils sur la meilleure façon de le faire ce serait super, Merci!
- Pourquoi ne pas vous venez de faire les mesures vous-même?
import datetime; start = datetime.time(); <do your stuff> end = datetime.time(); print(end-start)
- Je ont et vont continuer à le faire. Cependant, je voulais avoir une idée des autres sur ce que les "meilleures pratiques" serait ici. Surtout depuis quelques options sont presque les mêmes à partir d'un angle de l'efficacité.
InformationsquelleAutor | 2013-06-07
Vous devez vous connecter pour publier un commentaire.
Vous pourriez ne pas être en mesure d'obtenir le format requis à partir de l'ORM. Cependant, vous pouvez efficacement faire quelque chose comme ceci:
et maintenant divisé les n-uplets en deux listes: (Tuple déballage)
.values_list()
(ou.iterator()
ou autre chose du mieux que je peut dire), django va lire tous les enregistrements dans la mémoire. Idéal pour des performances SQL, pas si grand pour la mémoire, si nous parlons de grandes lignes. Mon python processus utilisé > 300 mo de RAM. J'ai fini par utiliserPaginator
à boucle à travers des morceaux de dossiers. Mémoire vs vitesse est un compromis, et que j'ai réglé sur 10 000 enregistrements à la fois.Je vous suggérons d'utiliser le itérer la requête ensemble et à se conformer au format json dictionnaire de l'élément par élément de la queryset.
Normalement, Django QuerySets sont paresseux, ce qui signifie qu'ils obtiennent de la charge en mémoire à chaque fois qu'ils obtenir accès. Si vous chargez l'ensemble de la liste:
gps_time = [lp.gps_time for lp in c_layer_points]
vous disposez de tous les objets en mémoire (en milliers). Vous serez bien en faisant une simple itération:Comme une note de côté, vous n'avez pas besoin de la
;
de caractère à la fin de lignes en python 🙂Espérons que cette aide!