1.一次性取出你所需要的數據
單一動作,需要多次連接數據庫里的時候,最好一次性取出所有需要的數據,減少連接數據庫的次數。此類需求推薦使用QuerySet.select_related()和prefetch_related()
相反,別取出你不需要的東西,模板templateds里往往只需要實體的某幾個字段而不是全部,這時使用queryset.values()和values_list()對你有用,他們只取出你需要的字段,返回字典dict和列表list類型的東西,在模板里面夠用就可以,這可以減少內存損耗,提高性能。
使用queryset.count()代替len(queryset),雖然這兩個處理出來的結果是一樣的,但是前者性能優秀很多。同理判斷記錄存在的時候,queryset.exists()比if queryset實在強的太多了。
當然一樣的結果,當緩存里面已經存在的時候,就別再濫用count(),exitst(),all()函數了。
2.減少數據庫連接的次數
使用queryset.update()和delete(),這兩個函數是可以批量處理多條記錄的,使他們事半功倍;如果可以,被一條條數據去update delete處理,對於一次性取出來的關聯記錄,獲取外鍵的時候,直接取關聯表的屬性,而不是取關聯屬性,如entry.blog.id優於enrty.blog_id
3.在配置使用相對路徑
某些原因使得項目可能常常會被來回的遷移,如果事先沒有規划好這種可能性的話,這絕對是一個棘手的問題,有一個極好的技巧能夠確保你的Django項目在部署的過程中能夠輕松來回遷移,僅僅只需要編寫幾行代碼就可以在你的配置文件settings.py中。、
import os
BASE_DIR=os.path.dirname(os.path.abspath(__file__)
TEMPLATE_DIRS=(
BASE_DIR+'/templates',
)
4.使用Django-chunks
除了使用Django的富文本編輯器創建模塊更日益之外,Django-chunks同樣是用於模塊中,這個是重用代碼塊必不可少的工具。
5.使用緩存
如果性能在你的DJango項目中已經成為棘手的問題,那么你將需要使用一些緩存策略,然而Django為緩存提供很多的選擇,目前最好的無疑是Memcache,用Django安裝memcache非常的簡單,如果你使用memcache模塊的時候,只要模塊安裝完成后,你僅僅修改一行配置項,你的Django頁面變得輕快起來。
6.Django-debug-toolbar
它是一個非常方便的工具,可以深入了解代碼的工作以及它花費了多少時間。特別是他可以顯示你的頁面生成的SQL查詢,以及每個人花了多少時間。
一個在github上面的開源項目:https://github.com/dcramer/django-devserver
很棒的一個可視化工具,但是缺點只能處理text/html類型的response,因為是通過中間件修改返回的html代碼實現的
解決方法:開源使用這個庫,django-debug-panel
在配合鏈接中最后的chorme插件來使用,就可以查看所有異步請求中的詳細信息。
優點:
統計了總的sql查詢時間
重復查詢的sql的數量,在每條sql詳細信息中顯示重復的次數。
執行了sql的具體代碼位置
sql語句的高亮
sql查詢到的數據結果。
配置參考:
# debug_toolbar settings if DEBUG: INTERNAL_IPS = ('127.0.0.1',) MIDDLEWARE_CLASSES = ( # 'debug_toolbar.middleware.DebugToolbarMiddleware', 'debug_panel.middleware.DebugPanelMiddleware', ) + MIDDLEWARE_CLASSES INSTALLED_APPS += ( 'debug_toolbar', 'debug_panel', ) if settings.DEBUG: import debug_toolbar urlpatterns = [ url(r'^__debug__/', include(debug_toolbar.urls)), ] + urlpatterns
第三方面板也可以用於工具欄,可以(例如)報告緩存性能和模板呈現時間。
Third-party services
有一些免費服務獎從遠程HTTP客戶端的角度分析和報告您的網站的頁面的性能,實際上模擬實際用戶的體驗。
這些不能報告您的代碼的內部,但是可以提供有用的洞察您的網站的整體性能,包括不能從DJango環境中充分測量的方面。
實例包括:
雅虎Yslow
George pagespeed
還有一些付費服務執行類似的分析,包括一些是Django感知的,可以與您的代碼庫繼承,以更廣泛的分析其性能。
7.line profiler
最好用的還是去line profiler去找程序的瓶頸,顯示一個方法內哪行代碼運行的時間最久。
8.在較低級別而不是較高的級別執行此工作計划總是更快。在更高層次,系統必須通過多級抽象和多層機械來處理對象。
也就是說,數據庫通常可以比python更快的完成事情,這樣比模板語言更快。
9.HTTP performance
Middleware
Django附帶了一些有用的middleware,可以幫助優化您的網站的性能,他們包括
conditionGetMiddleware
添加了對現代瀏覽器的支持,可以根據ETag和Last-Modified標頭有條件的獲取響應。
GzipMiddleware
壓縮所有現代瀏覽器的響應,節省帶寬和傳輸時間,親注意,GzipMiddleware目前被認為是一種安全風險,並且容易受到TSL/SSL提供的保護無效的攻擊,有關詳細的信息,請參閱GzipMiddleware中的警告。
10.Session
Using Cached session
Using Cached session可能是一種通過消除從像數據庫這樣比較慢的存儲源加載的會話數據而改為經常使用的會話數據存儲在內存中來提高性能的方法。
11.Static Files
靜態文件,根據定義是不動態的,使優化增益的一個優秀的目標。
Minification
一些第三方Django工具和包提供了縮小HTML,css,javascript的能力,他們刪除不必要的空格,換行符和注釋,縮短變量名,從而減少您的網站發布文檔的大小。
12.Template Performance
注意:
使用{% 阻止 %} 比使用{% 包括 %}
從許多小塊的組裝的重碎片模塊可能會影響性能。
The cached template loader
啟用cache temolate loader通常會大幅提高性能,因為它避免每次需要時編譯每個模板渲染。
13.在代碼方面的優化
核心模塊使用cpython來實現,大幅度提高代碼的運行速度。
