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

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

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

前言

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

是一段導(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秒。

總結(jié)

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

相關(guān)文章

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

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

    這篇文章主要介紹了mysql 之通過(guò)配置文件鏈接數(shù)據(jù)庫(kù)的相關(guān)資料,主要是一個(gè)單例餓漢式的獲得數(shù)據(jù)庫(kù)連接方法工具類的實(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)過(guò)濾敏感詞

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

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

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

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

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

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

    Python flask框架如何顯示圖像到web頁(yè)面

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

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

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

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

    下面小編就為大家分享一篇淺談Python用QQ郵箱發(fā)送郵件時(shí)授權(quán)碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    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

最新評(píng)論

贵定县| 闽侯县| 酉阳| 贵德县| 抚州市| 昌都县| 武邑县| 咸宁市| 南部县| 舞钢市| 高雄县| 璧山县| 孟津县| 集贤县| 东港市| 霍山县| 屏山县| 淮南市| 泾源县| 霍林郭勒市| 横峰县| 淮滨县| 怀安县| 兴安县| 喀喇| 湄潭县| 当涂县| 大化| 普兰县| 通城县| 兰溪市| 佛坪县| 来安县| 五指山市| 衡阳市| 丰县| 遂平县| 乌拉特后旗| 贡觉县| 南充市| 九龙坡区|