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

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

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

一 利用標準數(shù)據(jù)庫優(yōu)化技術(shù)

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

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

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

二 了解Django的QuerySets

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

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

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

利用好模板的with標簽:

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

使用QuerySets的iterator():   

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

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

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

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

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

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

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

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

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

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

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

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

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

對于一次性取出來的關(guān)聯(lián)記錄,獲取外鍵的時候,直接取關(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ù)庫,而后者連接兩次


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

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

相關(guān)文章

  • Python技巧匿名函數(shù)、回調(diào)函數(shù)和高階函數(shù)

    Python技巧匿名函數(shù)、回調(diào)函數(shù)和高階函數(shù)

    本文分享的是Python技巧匿名函數(shù)、回調(diào)函數(shù)和高階函數(shù),我們在Python中使用lambda表達式來使用匿名函數(shù),回調(diào)函數(shù)即callback,先寫一個函數(shù),讓預先寫好的系統(tǒng)來調(diào)用,一個函數(shù)可以作為參數(shù)傳給另外一個函數(shù),或者一個函數(shù)的返回值為另外一個函數(shù),滿足其一則為高階函數(shù)
    2021-12-12
  • pandas篩選某列出現(xiàn)編碼錯誤的解決方法

    pandas篩選某列出現(xiàn)編碼錯誤的解決方法

    今天小編就為大家分享一篇pandas篩選某列出現(xiàn)編碼錯誤的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • 使用Python爬蟲庫requests發(fā)送表單數(shù)據(jù)和JSON數(shù)據(jù)

    使用Python爬蟲庫requests發(fā)送表單數(shù)據(jù)和JSON數(shù)據(jù)

    今天再為大家介紹下使用Python爬蟲庫requests發(fā)送表單數(shù)據(jù)和JSON數(shù)據(jù)的方法,這是最基本的使用方法,大家可以參考測試下
    2020-01-01
  • Pandas如何對帶有Multi-column(多列名稱)的數(shù)據(jù)排序并寫入Excel中

    Pandas如何對帶有Multi-column(多列名稱)的數(shù)據(jù)排序并寫入Excel中

    這篇文章主要介紹了Pandas如何對帶有Multi-column(多列名稱)的數(shù)據(jù)排序并寫入Excel中問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python+opencv實現(xiàn)論文插圖局部放大并拼接效果

    python+opencv實現(xiàn)論文插圖局部放大并拼接效果

    在做圖像數(shù)據(jù)標注時,很難一次就做到精準標注,如果目標比較小,即使微調(diào)也難以做到精準,所以就需要另外一個窗口對標注區(qū)域進行局部放大以方便微調(diào),這篇文章主要給大家介紹了關(guān)于python+opencv實現(xiàn)論文插圖局部放大并拼接效果的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Python實現(xiàn)PS圖像抽象畫風效果的方法

    Python實現(xiàn)PS圖像抽象畫風效果的方法

    這篇文章主要介紹了Python實現(xiàn)PS圖像抽象畫風效果的方法,涉及Python基于skimage模塊進行圖像處理的相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • Python語言描述KNN算法與Kd樹

    Python語言描述KNN算法與Kd樹

    這篇文章主要介紹了Python語言描述KNN算法與Kd樹,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • python Tkinter實時顯示數(shù)據(jù)功能實現(xiàn)

    python Tkinter實時顯示數(shù)據(jù)功能實現(xiàn)

    這篇文章主要介紹了python Tkinter實時顯示數(shù)據(jù)功能實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • OpenCV?Python身份證信息識別過程詳解

    OpenCV?Python身份證信息識別過程詳解

    本篇文章使用OpenCV-Python和CnOcr來實現(xiàn)身份證信息識別的案例,本篇文章使用的Python版本為3.6,OpenCV-Python版本為3.4.1.15,如果是4.x版本的同學,可能會有一些Api操作不同,下面跟隨小編看下OpenCV?Python身份證信息識別過程
    2022-04-04
  • JupyterNotebook 輸出窗口的顯示效果調(diào)整方法

    JupyterNotebook 輸出窗口的顯示效果調(diào)整方法

    這篇文章主要介紹了JupyterNotebook 輸出窗口的顯示效果調(diào)整方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04

最新評論

民县| 甘肃省| 讷河市| 静安区| 淮安市| 柳河县| 九龙城区| 六枝特区| 江西省| 庆城县| 邹平县| 弥勒县| 德化县| 合川市| 杨浦区| 吴桥县| 广饶县| 临邑县| 修武县| 前郭尔| 贺兰县| 永和县| 海伦市| 德兴市| 蕲春县| 明溪县| 梧州市| 海丰县| 镇平县| 英德市| 邹城市| 曲麻莱县| 海兴县| 专栏| 乐亭县| 肃宁县| 江油市| 井冈山市| 汽车| 温宿县| 上林县|