最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django代碼性能優(yōu)化與Pycharm Profile使用詳解

 更新時(shí)間:2018年08月26日 14:37:17   作者:mattkang  
本文通過一個(gè)簡單的實(shí)例一步一步引導(dǎo)讀者對其進(jìn)行全方位的性能優(yōu)化,這篇文章主要給大家介紹了關(guān)于Django代碼性能優(yōu)化與Pycharm Profile使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

pycharm是python的一個(gè)商業(yè)的集成開發(fā)工具,本人感覺做python開發(fā)還是很好用的,django是一個(gè)很流行的python web開源框架,本文將通過實(shí)例代碼給大家介紹了關(guān)于Django代碼性能優(yōu)化與Pycharm Profile使用的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹吧

是一段導(dǎo)出數(shù)據(jù)月報(bào)的腳本,原先需要十幾秒,優(yōu)化后只需要1秒多。

Pycharm Profile

優(yōu)化第一步就是Profile,先看看慢在哪里。Pycharm自帶Profile工具,很方便。
拿一張官方圖說明一下。


圖表說明:

  • 給出了函數(shù)調(diào)用關(guān)系。
  • 紅色->黃綠色->綠色,顏色越深說明耗時(shí)越多。
  • 右上角的“x數(shù)字”代表函數(shù)調(diào)用次數(shù)。
  • Own代表該函數(shù)本身的耗時(shí),不包括調(diào)用子函數(shù);而Total包括調(diào)用子函數(shù)的耗時(shí)。還給出了耗時(shí)的百分比。
  • 可以右鍵“jump to source”,跳到對應(yīng)的源碼。

有了Profile,剩下的事情就好辦了。

首先,看到了有個(gè)工具函數(shù)調(diào)用了9千多次,這個(gè)函數(shù)用到了nametupled,花了很多時(shí)間,于是把nametupled去掉,節(jié)省了好幾秒的時(shí)間。

開啟Django logger并設(shè)置DEBUG級別

繼續(xù)Profile,看到時(shí)間主要在ORM查詢數(shù)據(jù)庫那里。
這時(shí),開啟Django本身的logger,級別調(diào)到DEBUG,這樣就會(huì)打印出查詢的SQL語句。

N+1問題

首先意識(shí)到的是ORM查詢的N+1問題。

比如有個(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語句,獲取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問題。

解決N+1的方法:

  • 如果是只用到id字段,則可以直接用user_id代替user.id
  • select_related。將相關(guān)的表也一同查詢。select_related如果不傳參數(shù),表示查詢所有外鍵的表。

又節(jié)省了幾秒的時(shí)間。

只查詢需要的字段

繼續(xù)看log,發(fā)現(xiàn)sql查詢次數(shù)是減少了很多,然而sql查詢語句很長,看來是把所有字段都查詢出來。

然而我很多時(shí)候只需要某幾個(gè)字段而已,這樣全查出來就浪費(fèi)了。

解決方法:

  • only()。只查詢想要的字段。比如Order.objects.only(‘user_id', ‘pay_date', ‘price')
  • annotate()。 可指定虛擬字段,如果外鍵關(guān)聯(lián)的表只用到小部分字段,可以直接annotate過來。比如將User表的realname字段賦給Order表叫user_realname虛擬字段.這樣就不需要order.user.realname查詢,只需要order.user_realname來查詢,不用select_related把user表全部字段給取出來。Order.objects.annotate(user_realname=F(‘user__realname'))。注意還用到了F(),表示純數(shù)據(jù)庫層面的操作,不需要拉到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秒。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • mysql 之通過配置文件鏈接數(shù)據(jù)庫

    mysql 之通過配置文件鏈接數(shù)據(jù)庫

    這篇文章主要介紹了mysql 之通過配置文件鏈接數(shù)據(jù)庫的相關(guān)資料,主要是一個(gè)單例餓漢式的獲得數(shù)據(jù)庫連接方法工具類的實(shí)現(xiàn),需要的朋友可以參考下
    2017-08-08
  • python實(shí)現(xiàn)自動(dòng)打卡小程序

    python實(shí)現(xiàn)自動(dòng)打卡小程序

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)自動(dòng)打卡小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • python實(shí)現(xiàn)過濾敏感詞

    python實(shí)現(xiàn)過濾敏感詞

    這篇文章主要介紹了python如何實(shí)現(xiàn)過濾敏感詞,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-05-05
  • Python 支持向量機(jī)分類器的實(shí)現(xiàn)

    Python 支持向量機(jī)分類器的實(shí)現(xiàn)

    這篇文章主要介紹了Python 支持向量機(jī)分類器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 淺談python中列表、字符串、字典的常用操作

    淺談python中列表、字符串、字典的常用操作

    下面小編就為大家?guī)硪黄獪\談python中列表、字符串、字典的常用操作。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • Python flask框架如何顯示圖像到web頁面

    Python flask框架如何顯示圖像到web頁面

    這篇文章主要介紹了Python flask框架如何顯示圖像到web頁面,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Python實(shí)現(xiàn)定時(shí)自動(dòng)備份文件

    Python實(shí)現(xiàn)定時(shí)自動(dòng)備份文件

    隨著數(shù)據(jù)的不斷增長,文件備份變得越來越重要,這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)定時(shí)自動(dòng)備份文件功能,需要可以了解下
    2024-12-12
  • 淺談Python用QQ郵箱發(fā)送郵件時(shí)授權(quán)碼的問題

    淺談Python用QQ郵箱發(fā)送郵件時(shí)授權(quán)碼的問題

    下面小編就為大家分享一篇淺談Python用QQ郵箱發(fā)送郵件時(shí)授權(quán)碼的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Python爬蟲文件下載圖文教程

    Python爬蟲文件下載圖文教程

    在本篇內(nèi)容里小編給大家分享的是關(guān)于Python爬蟲文件下載的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們學(xué)習(xí)下。
    2018-12-12
  • python 如何調(diào)用 dubbo 接口

    python 如何調(diào)用 dubbo 接口

    這篇文章主要介紹了python 如何調(diào)用 dubbo 接口,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-09-09

最新評論

五家渠市| 东源县| 西林县| 绥中县| 教育| 虞城县| 永靖县| 湘阴县| 泽普县| 原平市| 伊金霍洛旗| 东兴市| 威宁| 铜陵市| 井研县| 秀山| 榆社县| 开鲁县| 巨鹿县| 左权县| 叶城县| 尼玛县| 中宁县| 温泉县| 福泉市| 旬阳县| 安顺市| 栖霞市| 故城县| 保山市| 那曲县| 修水县| 家居| 桂东县| 通州市| 特克斯县| 聂拉木县| 共和县| 田东县| 汪清县| 额尔古纳市|