我想知道这会产生任何真正的效率差异(即计算时间,内存等......)
这是我的模特:
class FooUser(models.Model):
name = models.CharField(max_length=50)
sirname = models.CharField(max_length=50)
假设我在视图中保存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 :(得分: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)
将本地名称绑定到某个值所需的时间(例如input_name = request.session['name']
)与执行.save()
本身所需的时间相比绝对可以忽略不计 - 您永远无法做到测量它。因此,忘记这么小的效率并专注于样式,健壮性和可维护性(在您的示例中两者都很好) - 如果您需要调整应用程序的速度,请从分析开始
答案 2 :(得分:0)
我认为第二种方法(直接传递request.session元素)更具可读性。查看代码,我立即知道发生了什么 - 它使用未经修改的原始会话数据创建对象。如果它只是一个变量,我不知道它来自哪里,如果它在此期间被修改等等,我将不得不阅读更大部分的代码。您可以将语句拆分为多行。
FooUser(
name=request.session['name'],
sirname=request.session['sirname']
).save()