這篇文章主要為大家展示了“Django代碼性能優(yōu)化與使用Pycharm Profile的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Django代碼性能優(yōu)化與使用Pycharm Profile的示例分析”這篇文章吧。
一段導(dǎo)出數(shù)據(jù)月報(bào)的腳本,原先需要十幾秒,優(yōu)化后只需要1秒多。
Pycharm Profile
優(yōu)化第一步就是Profile,先看看慢在哪里。Pycharm自帶Profile工具,很方便。
拿一張官方圖說(shuō)明一下。
圖表說(shuō)明:
給出了函數(shù)調(diào)用關(guān)系。
紅色->黃綠色->綠色,顏色越深說(shuō)明耗時(shí)越多。
右上角的“x數(shù)字”代表函數(shù)調(diào)用次數(shù)。
Own代表該函數(shù)本身的耗時(shí),不包括調(diào)用子函數(shù);而Total包括調(diào)用子函數(shù)的耗時(shí)。還給出了耗時(shí)的百分比。
可以右鍵“jump to source”,跳到對(duì)應(yīng)的源碼。
有了Profile,剩下的事情就好辦了。
首先,看到了有個(gè)工具函數(shù)調(diào)用了9千多次,這個(gè)函數(shù)用到了nametupled,花了很多時(shí)間,于是把nametupled去掉,節(jié)省了好幾秒的時(shí)間。
開(kāi)啟Django logger并設(shè)置DEBUG級(jí)別
繼續(xù)Profile,看到時(shí)間主要在ORM查詢數(shù)據(jù)庫(kù)那里。
這時(shí),開(kāi)啟Django本身的logger,級(jí)別調(diào)到DEBUG,這樣就會(huì)打印出查詢的SQL語(yǔ)句。
N+1問(wèn)題
首先意識(shí)到的是ORM查詢的N+1問(wèn)題。
比如有個(gè)Order表,里面有個(gè)外鍵user_id是關(guān)聯(lián)User表.當(dāng)我們
for order in Order.objects.all(): order.user.id
的時(shí)候,Order.objects.all()只有1條sql語(yǔ)句,獲取Order表本身的字段到內(nèi)存,而不會(huì)將關(guān)聯(lián)的外鍵也獲取。
當(dāng)我們order.user_id的時(shí)候,不會(huì)觸發(fā)額外的sql查詢,而order.user.id的時(shí)候,會(huì)額外查詢User表。
for循環(huán)執(zhí)行了N次,就額外sql查詢了N次。故叫N+1問(wèn)題。
解決N+1的方法:
如果是只用到id字段,則可以直接用user_id代替user.id
select_related。將相關(guān)的表也一同查詢。select_related如果不傳參數(shù),表示查詢所有外鍵的表。
又節(jié)省了幾秒的時(shí)間。
只查詢需要的字段
繼續(xù)看log,發(fā)現(xiàn)sql查詢次數(shù)是減少了很多,然而sql查詢語(yǔ)句很長(zhǎng),看來(lái)是把所有字段都查詢出來(lái)。
然而我很多時(shí)候只需要某幾個(gè)字段而已,這樣全查出來(lái)就浪費(fèi)了。
解決方法:
only()。只查詢想要的字段。比如Order.objects.only(‘user_id', ‘pay_date', ‘price')
annotate()。 可指定虛擬字段,如果外鍵關(guān)聯(lián)的表只用到小部分字段,可以直接annotate過(guò)來(lái)。比如將User表的realname字段賦給Order表叫user_realname虛擬字段.這樣就不需要order.user.realname查詢,只需要order.user_realname來(lái)查詢,不用select_related把user表全部字段給取出來(lái)。Order.objects.annotate(user_realname=F(‘user__realname'))。注意還用到了F(),表示純數(shù)據(jù)庫(kù)層面的操作,不需要拉到python內(nèi)存進(jìn)行處理。
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.
至此,將整段代碼的執(zhí)行時(shí)間減少到了1.5秒。
以上是“Django代碼性能優(yōu)化與使用Pycharm Profile的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)站名稱:Django代碼性能優(yōu)化與使用PycharmProfile的示例分析-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://newbst.com/article14/dgigde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、營(yíng)銷型網(wǎng)站建設(shè)、小程序開(kāi)發(fā)、品牌網(wǎng)站制作、ChatGPT、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容