前言
pycharm是python的一個商業的集成開發工具,本人感覺做python開發還是很好用的,django是一個很流行的python web開源框架,本文將通過實例代碼給大家介紹了關于Django代碼性能優化與Pycharm Profile使用的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧
是一段導出數據月報的腳本,原先需要十幾秒,優化后只需要1秒多。
Pycharm Profile
優化第一步就是Profile,先看看慢在哪里。Pycharm自帶Profile工具,很方便。
拿一張官方圖說明一下。
圖表說明:
有了Profile,剩下的事情就好辦了。
首先,看到了有個工具函數調用了9千多次,這個函數用到了nametupled,花了很多時間,于是把nametupled去掉,節省了好幾秒的時間。
開啟Django logger并設置DEBUG級別
繼續Profile,看到時間主要在ORM查詢數據庫那里。
這時,開啟Django本身的logger,級別調到DEBUG,這樣就會打印出查詢的SQL語句。
N+1問題
首先意識到的是ORM查詢的N+1問題。
比如有個Order表,里面有個外鍵user_id是關聯User表.當我們
for order in Order.objects.all(): order.user.id
的時候,Order.objects.all()只有1條sql語句,獲取Order表本身的字段到內存,而不會將關聯的外鍵也獲取。
當我們order.user_id的時候,不會觸發額外的sql查詢,而order.user.id的時候,會額外查詢User表。
for循環執行了N次,就額外sql查詢了N次。故叫N+1問題。
解決N+1的方法:
又節省了幾秒的時間。
只查詢需要的字段
繼續看log,發現sql查詢次數是減少了很多,然而sql查詢語句很長,看來是把所有字段都查詢出來。
然而我很多時候只需要某幾個字段而已,這樣全查出來就浪費了。
解決方法:
An F() object represents the value of a model field or annotated column. It makes it possible to refer to model field values and perform database operations using them without actually having to pull them out of the database into Python memory.
至此,將整段代碼的執行時間減少到了1.5秒。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。
新聞熱點
疑難解答