2010-03-20 40 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