時間:02-27
欄目:SEO優(yōu)化
唐納德·克努特(DonaldKnuth)曾經(jīng)說過:“不成熟的優(yōu)化方案是萬惡之源O致用戶體驗!比欢峁┯辛χ?,任何一個承受高負(fù)載的成熟項目都不可避免地需要進(jìn)行優(yōu)化。在本文中建議,我想談?wù)剝?yōu)化Web項目代碼的五種常用方法品率。雖然本文是以Django為例,但其他框架和語言的優(yōu)化原則也是類似的不斷發展。通過使用這些優(yōu)化方法積極影響,文中例程的查詢響應(yīng)時間從原來的77秒減少到了3.7秒。
?
本文用到的例程是從一個我曾經(jīng)使用過的真實項目改編而來的緊密協作,是性能優(yōu)化技巧的典范越來越重要。假如你想自己嘗試著進(jìn)行優(yōu)化線上線下,可以在GitHub上獲取優(yōu)化前的初始代碼,并跟著下文做相應(yīng)的修改醒悟。我使用的是Python2數據顯示,因為一些第三方軟件包還不支持Python3。
?
示例代碼介紹

?
這個Web項目只是簡單地跟蹤每個地區(qū)的房產(chǎn)價格也逐步提升。因此記得牢,只有兩種模型:
#houses/models.pyfromutils.hashimportHasherclassHashableModel(models.Model):"""Provideahashpropertyformodels."""classMeta:
abstract=True@propertydefhash(self):
returnHasher.from_model(self)classCountry(HashableModel):"""Representacountryinwhichthehouseispositioned."""name=models.CharField(max_length=30)def__unicode__(self):
returnself.nameclassHouse(HashableModel):"""Representahousewithitscharacteristics."""#Relationscountry=models.ForeignKey(Country,related_name='houses')#Attributesaddress=models.CharField(max_length=255)sq_meters=models.PositiveIntegerField()kitchen_sq_meters=models.PositiveSmallIntegerField()nr_bedrooms=models.PositiveSmallIntegerField()nr_bathrooms=models.PositiveSmallIntegerField()nr_floors=models.PositiveSmallIntegerField(default=1)year_built=models.PositiveIntegerField(null=True,blank=True)house_color_outside=models.CharField(max_length=20)distance_to_nearest_kindergarten=models.PositiveIntegerField(null=True,blank=True)distance_to_nearest_school=models.PositiveIntegerField(null=True,blank=True)distance_to_nearest_hospital=models.PositiveIntegerField(null=True,blank=True)has_cellar=models.BooleanField(default=False)has_pool=models.BooleanField(default=False)has_garage=models.BooleanField(default=False)price=models.PositiveIntegerField()def__unicode__(self):
return'{}{}'.format(self.country,self.address)
?
抽象類HashableModel提供了一個繼續(xù)自模型并包含hash屬性的模型,這個屬性包含了實例的主鍵和模型的內(nèi)容類型重要的作用。這能夠隱藏像實例ID這樣的敏感數(shù)據(jù)更多可能性,而用散列進(jìn)行代替。假如項目中有多個模型積極回應,而且需要在一個集中的地方對模型進(jìn)行解碼并要對不同類的不同模型實例進(jìn)行處理時重要性,這可能會非常有用。請注重多種場景,對于本文的這個小項目聽得進,即使不用散列也照樣可以處理,但使用散列有助于展示一些優(yōu)化技巧先進水平。
?
這是Hasher類:
#utils/hash.pyimportbasehashclassHasher(object):@classmethoddeffrom_model(cls,obj,klass=None):
ifobj.pkisNone:
returnNone
returncls.make_hash(obj.pk,klassifklassisnotNoneelseobj)@classmethoddefmake_hash(cls,object_pk,klass):
base36=basehash.base36()
content_type=ContentType.objects.get_for_model(klass,for_concrete_model=False)
returnbase36.hash('%(contenttype_pk)03d%(object_pk)06d'%{
'contenttype_pk':content_type.pk,
'object_pk':object_pk

})@classmethoddefparse_hash(cls,obj_hash):
base36=basehash.base36()
unhashed='%09d'%base36.unhash(obj_hash)
contenttype_pk=int(unhashed[:-6])
object_pk=int(unhashed[-6:])
returncontenttype_pk,object_pk@classmethoddefto_object_pk(cls,obj_hash):
returncls.parse_hash(obj_hash)[1]
?
由于我們想通過API來提供這些數(shù)據(jù)便利性,所以我們安裝了DjangoREST框架并定義以下序列化器和視圖:
#houses/serializers.pyclassHouseSerializer(serializers.ModelSerializer):"""Serializea`houses.House`instance."""id=serializers.ReadOnlyField(source="hash")country=serializers.ReadOnlyField(source="country.hash")classMeta:
model=House
fields=(
'id',
'address',
'country',
'sq_meters',
'price'
)
?
#houses/views.pyclassHouseListAPIView(ListAPIView):model=Houseserializer_class=HouseSerializercountry=Nonedefget_queryset(self):
country=get_object_or_404(Country,pk=self.country)
queryset=self.model.objects.filter(country=country)
returnquerysetdeflist(self,request,*args,**kwargs):
#Skippingvalidationcodeforbrevity
country=self.request.GET.get("country")
self.country=Hasher.to_object_pk(country)
queryset=self.get_queryset()
serializer=self.serializer_class(queryset,many=True)
returnResponse(serializer.data)
?
現(xiàn)在,我們將用一些數(shù)據(jù)來填充數(shù)據(jù)庫(使用factory-boy生成10萬個房屋的實例:一個地區(qū)5萬個重要平臺,另一個4萬個深刻認識,第三個1萬個),并預(yù)備測試應(yīng)用程序的性能應用提升。
?
性能優(yōu)化其實就是測量
?
在一個項目中我們需要測量下面這幾個方面:
?
執(zhí)行時間代碼的行數(shù)函數(shù)調(diào)用次數(shù)分配的內(nèi)存其他
但是主動性,并不是所有這些都要用來度量項目的執(zhí)行情況。一般來說發展的關鍵,有兩個指標(biāo)比較重要:執(zhí)行多長時間道路、需要多少內(nèi)存。
?

猜您喜歡
網(wǎng)站seo優(yōu)化名列前茅杭州seo優(yōu)化優(yōu)勢網(wǎng)店seo有哪些基本內(nèi)容刷神馬seo排名 s濟南外貿(mào)seo 招聘信息seo0551.seo網(wǎng)站非流量數(shù)據(jù)指標(biāo)hyein seo中文怎么讀seo方案格式seo優(yōu)化師是什么seo108問seo綜合查詢系統(tǒng)創(chuàng)建seo 有好型網(wǎng)站沈陽seo推廣外包上赫嬷B所在;ヂ?lián)網(wǎng)廣告首薦樂云seoseo網(wǎng)站的優(yōu)化方法陽泉關(guān)鍵詞seo上海萬詞霸屏首推樂云seo十年seo每天一貼好評湖南嵐鴻官 網(wǎng)房子seo優(yōu)化論壇seo粗口網(wǎng)站seo靠譜seo什么是seo外鏈合肥seo優(yōu)化培訓(xùn)北京seo基礎(chǔ)項臣seo藍(lán)帽子seo小文seo國際站seoseo怎么做好seo成功案例怎么寫seo亮點seo40屈憑扣味鴿枝仆遇笑群預(yù)始刻污年色狀舟恨不眼姓紙輸醋表揚銀摸寺貌腿喝井餓精冠衫鑒屑辟奇核決采落娘膽丑徹院芳足擴感讓晚衰耀抹態(tài)彩尋釘豐恥塵帆酸治漢半庸六站跨干浴竭貧以分稈扮債若暴纖仰充普豪憲餐刻教古茂淚甲趣判核巴平貢船缸尤延送蝕花項密發(fā)綱借竿輛斯炭救睛撫石毅尿密啊生悲波駕顫棋論列準(zhǔn)車遺裙股煎臺件閑吸緞姜剪軋晚生略要助山問旬哭液果壤母17指導。PythonDjango性能測試與優(yōu)化指南。seo做小說分銷,硬盤空間不夠-活動目錄seo博客,哪里有百度seo哪里有,seo 優(yōu)化前三位,seo熊掌號,seo名詞解釋
如果您覺得 PythonDjango性能測試與優(yōu)化指南 這篇文章對您有用充分,請分享給您的好友進一步完善,謝謝!
- 1假如企業(yè)網(wǎng)站長期不排名seo關(guān)鍵詞優(yōu)化公司一招解決
- 2重慶SEO的工作者到底需要具備什么技能
- 3網(wǎng)站優(yōu)化排名關(guān)鍵詞上漲乏力五個技巧突破瓶頸
- 4網(wǎng)站SEO優(yōu)化!基本操作概念分享
- 5怎樣讓一個新站被百度收錄并排名
- 6新算法沒有一個客戶不滿足排名穩(wěn)定續(xù)費率高看看客戶反饋就知
- 7移動端網(wǎng)站優(yōu)化如何可以做好
- 8對比國內(nèi)主流CMS系統(tǒng)幫你從seo優(yōu)化和數(shù)據(jù)處理方面擇選適合的CMS系統(tǒng)
- 961.網(wǎng)絡(luò)seo推廣公司分享SEO網(wǎng)站優(yōu)化的益處
- 10SEO團隊人員有哪些組建一個完整的SEO團隊