2010-02-22 63 views
0

我不知道会这样作任何真正的高效化差(即计算时间,内存等)Django的效率问题

这是我的模型:

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

假设我有2种不同的方法,同时节省在视图中的FooUser: 首先,将检索到的值分配给变量并在此之后将其传递给对象。

#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() 

第二个,直接传递的参数:

#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() 

我知道这个问题可能有点傻,但长期投入,通过这些输入对象使得代码不可读几乎:)

+0

@Ludwik Trammer:听起来像是一个答案。请将其发布为答案,以便我们可以正确地对其进行修改。 – 2010-02-22 14:53:47

+0

@ S.Lott:好的,我现在做了。我原本不是因为它不回答原来的问题(效率),但如果你认为我应该这样做,那么肯定,为什么不呢。你可以通过BTW评论评论。 – 2010-02-22 15:52:32

回答

4

此:

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

不复制字符串变量。它只是将指向字符串对象的指针分配给本地字典中的名称(input_name,input_sirname)。为了更好的解释,你可以在这里获得战利品:http://effbot.org/zone/python-objects.htm

写这个,让这些中间字典条目(input_name,input_sirname)在99,999%的情况下具有如此低的开销,我敢打赌你应该关注你的程序中的其他瓶颈。

请记住:过早的优化是所有罪恶:-)

+1

+1为过早优化提醒。 – cethegeek 2010-02-22 20:35:28

0

根我认为,第二种方法(直接传递的request.session元素)是更具有可读性。查看代码,我立即知道发生了什么 - 它使用未经修改的原始会话数据创建对象。如果它只是一个变量,我不知道它来自哪里,如果在此期间进行了修改等,我将不得不读取更大部分的代码。您可以将语句拆分为多行。

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

到本地名称绑定到一个值,如所需要的时间,例如,input_name = request.session['name'],相比执行.save()本身会花时间绝对是微不足道的 - 你永远无法衡量它。所以,忘记如此小的效率,关注样式,健壮性和可维护性(在这两种情况下都很好) - 如果您需要调整应用程序的速度,请从开始分析