2010-02-22 7 views
0

Je me demande que cela ferait une différence de efficieny (temps de calcul, mémoire, etc ..)Django question d'efficacité

Ceci est mon modèle:

class FooUser(models.Model): 
    name = models.CharField(max_length=50) 
    sirname = models.CharField(max_length=50) 

Supposons que j'ai 2 approches différentes tout en économisant un FooUser à une vue: Le premier, assigner des valeurs récupérées à une variable et le passer à l'objet après cela.

#say I retrieve name and sirname from users cookie.(lets not care for the exceptions for now. 
input_name =request.session['name'] 
input_sirname =request.session['sirname'] 

FooUser(name=input_name,sirname=input_sirname).save() 

deuxième, en passant directement comme paramètre:

#say I retrieve name and sirname from users cookie.(lets not care for the exceptions for now. 
FooUser(name=request.session['name'],sirname=request.session['sirname']).save() 

Je sais que cette question peut être un peu stupide, mais pour les entrées longues, en passant ces entrées à l'objet rend le code presque illisible :)

+0

@Ludwik Trammer: Cela ressemble à une réponse. S'il vous plaît postez comme une réponse afin que nous puissions l'améliorer correctement. –

+0

@ S.Lott: Ok, je l'ai fait maintenant. Je n'ai pas d'origine parce que ça ne répond pas à la question initiale (efficacité), mais si vous pensez que je devrais le faire alors, bien sûr, pourquoi pas. Vous pouvez upvote commentaires BTW. –

Répondre

4

Ce:

input_name =request.session['name'] 
input_sirname =request.session['sirname'] 

ne copie pas les chaînes à des variables. Il attribue uniquement des pointeurs aux objets chaîne aux noms dans le dictionnaire local (nom_entrée, nom_entrée_saisie). Pour une meilleure explication, vous pouvez prendre un butin à ceci: http://effbot.org/zone/python-objects.htm. En écrivant ceci, avoir ces entrées de dictionnaire intermédiaires (nom_entrée, nom_entrée) a une charge si faible dans 99,999% des cas, que je parie que vous avez d'autres goulots d'étranglement dans votre programme sur lesquels vous devriez vous concentrer.

Et rappelez-vous: l'optimisation prématurée est la racine de tout le mal :-)

+1

+1 pour le rappel d'optimisation prématurée. – cethegeek

0

Je dirais que la deuxième méthode (avec passage des éléments de request.session directement) est plus lisible. En regardant le code, je sais immédiatement ce qui se passe: il s'agit de créer un objet en utilisant des données de session brutes et non modifiées. S'il avait été juste une variable, je ne saurais pas d'où il vient, s'il avait été modifié entre-temps, etc. Je devrais lire une plus grande partie du code. Vous pouvez diviser l'instruction sur plusieurs lignes.

FooUser(
    name=request.session['name'], 
    sirname=request.session['sirname'] 
).save() 
1

Le temps nécessaire pour lier un nom local à une valeur, comme, par exemple, input_name = request.session['name'], est tout à fait négligeable par rapport au temps d'exécuter lui-même .save() prendra - vous ne serez jamais en mesure de le mesurer. Donc, oubliez ces petites efficacités et concentrez-vous sur le style, la robustesse, la maintenabilité (ce qui est bien dans les deux cas dans votre exemple) - si et quand vous avez besoin d'accélérer votre application, commencez par profilant.