2010-03-20 61 views
0

在使用手动事务提交Django视图功能,我有:Python:这些例子中的一个会浪费更多的内存吗?

context = RequestContext(request, data) 
transaction.commit() 
return render_to_response('basic.html', data, context) # Returns a Django ``HttpResponse`` object which is similar to a dictionary. 

我认为这是一个更好的主意来做到这一点:

context = RequestContext(request, data) 
response = render_to_response('basic.html', data, context) 
transaction.commit() 
return response 

如果页面无法正确渲染的第二个版本,事务被回滚。这似乎是这样做的合乎逻辑的方法,尽管当应用程序在生产中时,函数中当时不会有很多例外。

但是...我担心这可能会花费更多,并且由于应用程序对自定义事务处理的负担很重,所以这会通过许多函数充斥,所以现在是时候弄清楚了。

如果HttpResponse实例已经在内存中(在render_to_response()的位置),那么另一个引用的成本是多少?当函数结束时,没有引用(response变量)消失,这样当Django完成时将HttpResponse转换为用于输出Python的字符串可以立即进行垃圾收集吗?

是否有任何理由我想使用第一个版本(除了“它是少一行代码”)?

回答

3

你说“在这个函数中不会有很多例外”。这可能不是真的。请记住,查询集是从数据库中延迟获取的,所以实际上,很多数据库活动都可能在render_to_response调用中。

我会使用第二种风格。从某种意义上说,如果render_to_response中出现错误,您希望事务回滚。

参考费用几乎没有。不要试图优化它们。正确性比绝对最小内存占用更重要。

+0

@恩啊,好点。我忘记了Django的'QuerySets'直到读取值时才被使用(或者它们是以'QuerySet'不支持的方式操纵的]。内存使用情况如何(而不是我的答案之后是否应该使用第二个版本的问题)? – orokusaki 2010-03-20 16:20:56

相关问题