欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django的性能優(yōu)化實(shí)現(xiàn)解析

 更新時(shí)間:2019年07月30日 14:53:35   作者:一顆桃子t  
這篇文章主要介紹了Django的性能優(yōu)化實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一 利用標(biāo)準(zhǔn)數(shù)據(jù)庫優(yōu)化技術(shù)

傳統(tǒng)數(shù)據(jù)庫優(yōu)化技術(shù)博大精深,不同的數(shù)據(jù)庫有不同的優(yōu)化技巧,但重心還是有規(guī)則的。在這里算是題外話,挑兩點(diǎn)通用的說說:

索引,給關(guān)鍵的字段添加索引,性能能更上一層樓,如給表的關(guān)聯(lián)字段,搜索頻率高的字段加上索引等。Django建立實(shí)體的時(shí)候,支持給字段添加索引,具體參考Django.db.models.Field.db_index。按照經(jīng)驗(yàn),Django建立實(shí)體之前應(yīng)該早想好表的結(jié)構(gòu),盡量想到后面的擴(kuò)展性,避免后面的表的結(jié)構(gòu)變得面目全非。

使用適當(dāng)字段類型,本來varchar就搞定的字段,就別要text類型,小細(xì)節(jié)別不關(guān)緊要,后頭數(shù)據(jù)量一上去,愈來愈多的數(shù)據(jù),小字段很可能是大問題。

二 了解Django的QuerySets

了解Django的QuerySets對(duì)象,對(duì)優(yōu)化簡單程序有至關(guān)重要的作用。QuerySets是有緩存的,一旦取出來,它就會(huì)在內(nèi)存里呆上一段時(shí)間,盡量重用它。

# 了解緩存屬性:
>>> entry = Entry.objects.get(id=1)
>>> entry.blog  # 博客實(shí)體第一次取出,是要訪問數(shù)據(jù)庫的
>>> entry.blog  # 第二次再用,那它就是緩存里的實(shí)體了,不再訪問數(shù)據(jù)庫
>>> entry = Entry.objects.get(id=1)
>>> entry.authors.all()  # 第一次all函數(shù)會(huì)查詢數(shù)據(jù)庫
>>> entry.authors.all()  # 第二次all函數(shù)還會(huì)查詢數(shù)據(jù)庫

all,count exists是調(diào)用函數(shù)(需要連接數(shù)據(jù)庫處理結(jié)果的),注意在模板template里的代碼,模板里不允許括號(hào),但如果使用此類的調(diào)用函數(shù),一樣去連接數(shù)據(jù)庫的,能用緩存的數(shù)據(jù)就別連接到數(shù)據(jù)庫去處理結(jié)果。還要注意的是,自定義的實(shí)體屬性,如果調(diào)用函數(shù)的,記得自己加上緩存策略。

利用好模板的with標(biāo)簽:

模板中多次使用的變量,要用with標(biāo)簽,把它看成變量的緩存行為吧。

使用QuerySets的iterator():   

通常QuerySets先調(diào)用iterator再緩存起來,當(dāng)獲取大量的實(shí)體列表而僅使用一次時(shí),緩存行為會(huì)耗費(fèi)寶貴的內(nèi)存,這時(shí)iterator()能幫到你,iterator()只調(diào)用iterator而省 去了緩存步驟,顯著減少內(nèi)存占用率,具體參考相關(guān)文檔。

三 數(shù)據(jù)庫的工作就交給數(shù)據(jù)庫本身計(jì)算,別用Python處理

  • 使用 filter and exclude 過濾不需要的記錄,這兩個(gè)是最常用語句,相當(dāng)是SQL的where
  • 同一實(shí)體里使用F()表達(dá)式過濾其他字段
  • 使用annotate對(duì)數(shù)據(jù)庫做聚合運(yùn)算

不要用python語言對(duì)以上類型數(shù)據(jù)過濾篩選,同樣的結(jié)果,python處理復(fù)雜度要高,而且效率不高, 白白浪費(fèi)內(nèi)存

  • 使用QuerySet.extra() extra雖然擴(kuò)展性不太好,但功能很強(qiáng)大,如果實(shí)體里需要需要增加額外屬性,不得已時(shí),通過extra來實(shí)現(xiàn),也是個(gè)好辦法
  • 使用原生的SQL語句 如果發(fā)現(xiàn)Django的ORM已經(jīng)實(shí)現(xiàn)不了你的需求,而extra也無濟(jì)于事的時(shí)候,那就用原生SQL語句

四 如果需要就一次性取出你所需要的數(shù)據(jù)

單一動(dòng)作(如:同一個(gè)頁面)需要多次連接數(shù)據(jù)庫時(shí),最好一次性取出所有需要的數(shù)據(jù),減少連接數(shù)據(jù)庫次數(shù)。

此類需求推薦使用QuerySet.select_related() (主動(dòng)連表)和 prefetch_related()(被動(dòng)連表)

相反,別取出你不需要的東西,模版templates里往往只需要實(shí)體的某幾個(gè)字段而不是全部,這時(shí)QuerySet.values() 和 values_list(),對(duì)你有用,它們只取你需要的字段,返回字典dict和列表list類型的東西,在模版里夠用即可,這可減少內(nèi)存損耗,提高性能

同樣QuerySet.defer()和only()對(duì)提高性能也有很大的幫助,一個(gè)實(shí)體里可能有不少的字段,有些字段包含很多元數(shù)據(jù),比如博客的正文,很多字符組成,Django獲取實(shí)體時(shí)(取出實(shí)體過程中會(huì)進(jìn)行一些python類型轉(zhuǎn)換工作),我們可以延遲大量元數(shù)據(jù)字段的處理,只處理需要的關(guān)鍵字段,這時(shí)QuerySet.defer()就派上用場了,在函數(shù)里傳入需要延時(shí)處理的字段即可;而only()和defer()是相反功能

使用QuerySet.count()代替len(queryset),雖然這兩個(gè)處理得出的結(jié)果是一樣的,但前者性能優(yōu)秀很多。同理判斷記錄存在時(shí),QuerySet.exists()比if queryset實(shí)在強(qiáng)得太多了

五 懂減少數(shù)據(jù)庫的連接數(shù)

使用 QuerySet.update() 和 delete(),這兩個(gè)函數(shù)是能批處理多條記錄的,適當(dāng)使用它們事半功倍;如果可以,別一條條數(shù)據(jù)去update delete處理。

對(duì)于一次性取出來的關(guān)聯(lián)記錄,獲取外鍵的時(shí)候,直接取關(guān)聯(lián)表的屬性,而不是取關(guān)聯(lián)屬性,如:

entry.blog.id
優(yōu)于
entry.blog__id


# 善于使用批量插入記錄,如:
Entry.objects.bulk_create([
  Entry(headline="Python 3.0 Released"),
  Entry(headline="Python 3.1 Planned")
])
優(yōu)于
Entry.objects.create(headline="Python 3.0 Released")
Entry.objects.create(headline="Python 3.1 Planned")
# 前者只連接一次數(shù)據(jù)庫,而后者連接兩次


# 還有相似的動(dòng)作需要注意的,如:多對(duì)多的關(guān)系,
my_band.members.add(me, my_friend)
優(yōu)于
my_band.members.add(me)
my_band.members.add(my_friend)

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python人工智能構(gòu)建簡單聊天機(jī)器人示例詳解

    Python人工智能構(gòu)建簡單聊天機(jī)器人示例詳解

    這篇文章主要為大家介紹了Python人工智能構(gòu)建簡單聊天機(jī)器人示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Python中range函數(shù)的基本用法完全解讀

    Python中range函數(shù)的基本用法完全解讀

    range函數(shù)大多數(shù)時(shí)常出現(xiàn)在for循環(huán)中,在for循環(huán)中可做為索引使用,下面這篇文章主要給大家介紹了關(guān)于Python中range函數(shù)的基本用法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • Django restframework 框架認(rèn)證、權(quán)限、限流用法示例

    Django restframework 框架認(rèn)證、權(quán)限、限流用法示例

    這篇文章主要介紹了Django restframework 框架認(rèn)證、權(quán)限、限流用法,結(jié)合實(shí)例形式詳細(xì)分析了Djangorestframework 框架認(rèn)證、權(quán)限、限流的具體使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • Python Pandas數(shù)據(jù)分析工具用法實(shí)例

    Python Pandas數(shù)據(jù)分析工具用法實(shí)例

    這篇文章主要介紹了Python Pandas數(shù)據(jù)分析工具用法實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • PyCharm無法識(shí)別PyQt5的2種解決方法,ModuleNotFoundError: No module named ''pyqt5''

    PyCharm無法識(shí)別PyQt5的2種解決方法,ModuleNotFoundError: No module named

    這篇文章主要介紹了PyCharm無法識(shí)別PyQt5的兩種解決辦法,ModuleNotFoundError: No module named 'pyqt5',需要的朋友可以參考下
    2020-02-02
  • python中json操作之json.loads、json.load、json.jumps及json.jump用法

    python中json操作之json.loads、json.load、json.jumps及json.jump用法

    最近在python里面用json讀取json文件,可是老是不成功,特此記錄一下,下面這篇文章主要給大家介紹了關(guān)于python中json操作之json.loads、json.load、json.jumps及json.jump用法的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • Python實(shí)現(xiàn)的十進(jìn)制小數(shù)與二進(jìn)制小數(shù)相互轉(zhuǎn)換功能

    Python實(shí)現(xiàn)的十進(jìn)制小數(shù)與二進(jìn)制小數(shù)相互轉(zhuǎn)換功能

    這篇文章主要介紹了Python實(shí)現(xiàn)的十進(jìn)制小數(shù)與二進(jìn)制小數(shù)相互轉(zhuǎn)換功能,結(jié)合具體實(shí)例形式詳細(xì)分析了二進(jìn)制與十進(jìn)制相互轉(zhuǎn)換的原理及Python相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-10-10
  • Python獲取女友聊天記錄詳細(xì)流程

    Python獲取女友聊天記錄詳細(xì)流程

    就在前段時(shí)間,在大學(xué)睡我上鋪的兄弟,在兄嘚群里討論,說:他發(fā)現(xiàn)女朋友這幾天只要下班就坐在電腦前,不是工作原因。而且只要他靠近一點(diǎn)就會(huì)立即退出頁面,所以他一直很懷疑,在群里問我們這一個(gè)個(gè)單身狗。然后就出現(xiàn)下面這一段對(duì)話
    2021-10-10
  • Django項(xiàng)目中model的數(shù)據(jù)處理以及頁面交互方法

    Django項(xiàng)目中model的數(shù)據(jù)處理以及頁面交互方法

    今天小編就為大家分享一篇Django項(xiàng)目中model的數(shù)據(jù)處理以及頁面交互方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python Dataframe常見索引方式詳解

    Python Dataframe常見索引方式詳解

    這篇文章主要介紹了Python Dataframe常見索引方式詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05

最新評(píng)論