1. 內存、內存,仍是加內存php
2. 使用單獨的靜態文件服務器html
3. 關閉KeepAlive(若是服務器不提供靜態文件服務,如:大文件下載)python
4. 使用memcachedgit
5. 使用select_related()加載關聯表數據程序員
6. 使用values()過濾沒必要要的字段查詢github
7. 使用模板cache數據庫
8. 加載編譯的模板django
from django.template import loader from django.http import HttpResponse #loads and compiles the template myview_template = loader.get_template('path/to/template.html') def myview(request): # do sth¡ return HttpResponse(myview_template.render( context ))
而不是直接用 render_to_response服務器
程序員都喜歡去的地方:http://www.lailu8.com
Django數據層提供各類途徑優化數據的訪問,一個項目大量優化工做通常是放在後期來作,早期的優化是「萬惡之源」,這是前人總結的經驗,不無道理。若是事先理解Django的優化技巧,開發過程當中稍稍留意,後期會省很多的工做量。
一 利用標準數據庫優化技術:
傳統數據庫優化技術博大精深,不一樣的數據庫有不一樣的優化技巧,但重心仍是有規則的。在這裏算是題外話,挑兩點通用的說說:
索引,給關鍵的字段添加索引,性能能更上一層樓,如給表的關聯字段,搜索頻率高的字段加上索引等。Django創建實體的時候,支持給字段添加索引,具體參考Django.db.models.Field.db_index。按照經驗,Django創建實體以前應該早想好表的結構,儘可能想到後面的擴展性,避免後面的表的結構變得面目全非。
使用適當字段類型,原本varchar就搞定的字段,就別要text類型,小細節別不關緊要,後頭數據量一上去,幾億幾億的數據,小字段極可能是大問題。
二 瞭解Django的QuerySets:
瞭解Django的QuerySets對象,對優化簡單程序有相當重要的做用。QuerySets是有緩存的,一旦取出來,它就會在內存裏呆上一段時間,儘可能重用它。舉個簡單的例子:
瞭解緩存屬性:
>>> entry = Entry.objects.get(id=1)
>>> entry.blog # 博客實體第一次取出,是要訪問數據庫的
>>> entry.blog # 第二次再用,那它就是緩存裏的實體了,再也不訪問數據庫
但下面的例子就不同,
>>> entry = Entry.objects.get(id=1)
>>> entry.authors.all() # 第一次all函數會查詢數據庫
>>> entry.authors.all() # 第二次all函數還會查詢數據庫
all,count exists是調用函數(須要鏈接數據庫處理結果的),注意在模板template裏的代碼,模板裏不容許括號,但若是使用此類的調用函數,同樣去鏈接數據庫的,能用緩存的數據就別鏈接到數據庫去處理結果。還要注意的是,自定義的實體屬性,若是調用函數的,記得本身加上緩存策略。
利用好模板的with標籤:
模板中屢次使用的變量,要用with標籤,把它當作變量的緩存行爲吧。
使用QuerySets的iterator():
一般QuerySets先調用iterator再緩存起來,當獲取大量的實體列表而僅使用一次時,緩存行爲會耗費寶貴的內存,這時iterator()能幫到你,iterator()只調用iterator而省去了緩存步驟,顯著減小內存佔用率,具體參考相關文檔。
三 數據庫的工做就交給數據庫自己計算,別用Python處理:
1 使用 filter and exclude 過濾不須要的記錄,這兩個是最經常使用語句,至關是SQL的where。
2 同一實體裏使用F()表達式過濾其餘字段。
3 使用annotate對數據庫作聚合運算。
不要用python語言對以上類型數據過濾篩選,一樣的結果,python處理複雜度要高,並且效率不高, 白白浪費內存。
使用QuerySet.extra():
extra雖然擴展性不太好,但功能很強大,若是實體裏須要須要增長額外屬性,不得已時,經過extra來實現,也是個好辦法。
使用原生的SQL語句:
若是發現Django的ORM已經實現不了你的需求,而extra也無濟於事的時候,那就用原生SQL語句吧,用Djangoango.db.connection.queries去實現你須要的東西。
四 若是須要就一次性取出你所須要的數據:
單一動做(如:同一個頁面)須要屢次鏈接數據庫時,最好一次性取出全部須要的數據,減小鏈接數據庫次數。此類需求推薦使用QuerySet.select_related() 和 prefetch_related()。
相反,別取出你不須要的東西,模版templates裏每每只須要實體的某幾個字段而不是所有,這時QuerySet.values() 和 values_list(),對你有用,它們只取你須要的字段,返回字典dict和列表list類型的東西,在模版裏夠用便可,這可減小內存損耗,提升性能。
一樣QuerySet.defer()和only()對提升性能也有很大的幫助,一個實體裏可能有很多的字段,有些字段包含不少元數據,好比博客的正文,不少字符組成,Django獲取實體時(取出實體過程當中會進行一些python類型轉換工做),咱們能夠延遲大量元數據字段的處理,只處理須要的關鍵字段,這時QuerySet.defer()就派上用場了,在函數裏傳入須要延時處理的字段便可;而only()和defer()是相反功能。
使用QuerySet.count()代替len(queryset),雖然這兩個處理得出的結果是同樣的,但前者性能優秀不少。同理判斷記錄存在時,QuerySet.exists()比if queryset實在強得太多了。
固然同樣的結果,在緩存裏已經存在,就別濫用count(),exists(),all()函數了。
五 懂減小數據庫的鏈接數:
使用 QuerySet.update() 和 delete(),這兩個函數是能批處理多條記錄的,適當使用它們事半功倍;若是能夠,別一條條數據去update delete處理。
對於一次性取出來的關聯記錄,獲取外鍵的時候,直接取關聯表的屬性,而不是取關聯屬性,如:
entry.blog.id
優於
entry.blog_id
善於使用批量插入記錄,如:
Entry.objects.bulk_create([
Entry(headline="Python 3.0 Released"),
Entry(headline="Python 3.1 Planned")
])
優於
Entry.objects.create(headline="Python 3.0 Released")
Entry.objects.create(headline="Python 3.1 Planned")
前者只鏈接一次數據庫,然後者鏈接兩次哦。
還有類似的動做須要注意的,如:多對多的關係,
my_band.members.add(me, my_friend)
優於
my_band.members.add(me)
my_band.members.add(my_friend)
爲何,批量處理的角度本身琢磨一下。
0、 在配置中使用相對路徑
某些緣由使得項目可能經常會被來回的遷移。若是沒有事先規劃好這種可能性的話這絕對是一個棘手的問題。Rob Hudson 有一個極好的技巧可以確保你的Django項目在部署過程當中可以輕鬆的來回遷移。僅僅只要編寫幾行代碼在你的配置文件(settings.py)中。
1
2
3
4
5
6
|
import
os
BASE_DIR
=
os.path.dirname(os.path.abspath(__file__))
TEMPLATE_DIRS
=
(
BASE_DIR
+
'/templates'
,
)
|
一、 使用{%url%}標籤
儘量使用向後兼容的{%url%}標籤來替換硬編碼形式的href,與使用絕對路徑的url(固然最好不要這樣作) 同樣達到相同的效果。你的Django項目遷移起來,那些連接也不會有影響。(譯者注:好比說咱們有一個views.about函數指向about頁面r’^about/$’,就能夠{% url views.about as about_url %}而後用{{about_url}}這個變量來代替絕對URL地址)儘管它還不是最高級的技巧,可是它確實值得你應用於Django項目中。
Photo by Cloudzilla.
二、 嘗試把Django admin應用到PHP項目中
Django最偉大的特性之一就是已經成爲Django的核心功能的用戶驗證系統。它易安裝,主要用於用戶認證和其它一些必要的配置。這個酷斃了的用戶系統甚至被建議應用到你的PHP項目中去,這裏有一邊Jeff Croft 關於爲何Django可以做爲任何語言任何應用中的系統管理模塊的一個很好的解決方案。
三、 使用獨立的媒體服務器
在開發環境中把靜態文件放在與Django項目所在的同一臺服務器中問題並不大,可是卻不要使用在生產環境中,爲何?效率問題。Jacobian.org給出了一個合理的解釋。經過一臺獨立的服務器來處理靜態文件,性能將獲得有效的提高,若是不想買服務器的話,那麼使用Amazon S3相對來更便宜。
四、 使用Debugger工具條
調試工具對任何一種語言來講都是不可或缺的.他們可以加快開發的速度,指出潛在的缺陷. Rob Hudson開發了一個對開發人員很是有用django調試工具。
五、 使用Django單元測試
利用單元測試確保你代碼的改變和預期的同樣,而不會破壞任何老的代碼,以便向後兼容。Django一個強大的特性就是他能極其簡單地寫單元測試。Django也可直接使用python的文本測試和單元測試。Django的文檔提供了一個詳細的教程和樣例代碼關於怎樣作單元測試使得代碼正確地運行,以及去除討厭的bug
六、 使用速查卡
這裏有兩頁厚的速查卡,在 Django文檔中你可能翻來覆去要找半天的東西在這裏一目瞭然。它包含以下幾個主題
模板:
模板標籤及可選項
模板過濾器及可選項
日期格式化語法快速查閱
模型:
域和及選項
經常使用域的可選項
元類型可選項
模型管理可選項
表單:
域和可選項
經常使用域可選項
標準錯誤消息鍵值
七、使用Django-chunks
除了使用Django的富文本編輯器建立塊更容易以外,Django-chunks一樣是用於模板中,這是重用代碼塊的必不可少的工具。
八、 使用Memcache
若是性能在你的Django項目中已經成爲一個棘手的問題,那麼你將須要使用一些緩存策略。然而Django爲緩存提供不少的選擇。目前最好的無疑是Memcache,用Django安裝memcache很是地簡單,若是你使用cmemcache模塊的時候。只要模塊安裝完成後,你僅僅修改一行配置項,你的Django頁面變得輕快起來。
九、使用Django,心動不如行動
在你閱讀完這篇文章後若是你仍然不徹底理解Django的強大,在你的下一個項目中使用Django的一個合符情理的理由就是:它可以節省各類不一樣軟件設計的時間。Jeff Croft解釋爲何用Django建立一個項目比你本身設計出來的更高效。Django容許你擴展本身的Web站點,不須要擔憂設計或者代碼以及數據庫的兼容性,它會工做地很棒。