返回頂部
關(guān)閉軟件導(dǎo)航
位置:首頁(yè) > 技術(shù)分享 > SEO優(yōu)化>PythonDjango性能測(cè)試與優(yōu)化指南

唐納德·克努特(DonaldKnuth)曾經(jīng)說(shuō)過(guò):“不成熟的優(yōu)化方案是萬(wàn)惡之源。”然而,任何一個(gè)承受高負(fù)載的成熟項(xiàng)目都不可避免地需要進(jìn)行優(yōu)化。在本文中,我想談?wù)剝?yōu)化Web項(xiàng)目代碼的五種常用方法。雖然本文是以Django為例,但其他框架和語(yǔ)言的優(yōu)化原則也是類(lèi)似的。通過(guò)使用這些優(yōu)化方法,文中例程的查詢(xún)響應(yīng)時(shí)間從原來(lái)的77秒減少到了3.7秒。

?

本文用到的例程是從一個(gè)我曾經(jīng)使用過(guò)的真實(shí)項(xiàng)目改編而來(lái)的,是性能優(yōu)化技巧的典范。假如你想自己嘗試著進(jìn)行優(yōu)化,可以在GitHub上獲取優(yōu)化前的初始代碼,并跟著下文做相應(yīng)的修改。我使用的是Python2,因?yàn)橐恍┑谌杰浖€不支持Python3。

?

示例代碼介紹

PythonDjango性能測(cè)試與優(yōu)化指南

?

這個(gè)Web項(xiàng)目只是簡(jiǎn)單地跟蹤每個(gè)地區(qū)的房產(chǎn)價(jià)格。因此,只有兩種模型:

#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)

?

抽象類(lèi)HashableModel提供了一個(gè)繼續(xù)自模型并包含hash屬性的模型,這個(gè)屬性包含了實(shí)例的主鍵和模型的內(nèi)容類(lèi)型。這能夠隱藏像實(shí)例ID這樣的敏感數(shù)據(jù),而用散列進(jìn)行代替。假如項(xiàng)目中有多個(gè)模型,而且需要在一個(gè)集中的地方對(duì)模型進(jìn)行解碼并要對(duì)不同類(lèi)的不同模型實(shí)例進(jìn)行處理時(shí),這可能會(huì)非常有用。請(qǐng)注重,對(duì)于本文的這個(gè)小項(xiàng)目,即使不用散列也照樣可以處理,但使用散列有助于展示一些優(yōu)化技巧。

?

這是Hasher類(lèi):

#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]

?

由于我們想通過(guò)API來(lái)提供這些數(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ù)來(lái)填充數(shù)據(jù)庫(kù)(使用factory-boy生成10萬(wàn)個(gè)房屋的實(shí)例:一個(gè)地區(qū)5萬(wàn)個(gè),另一個(gè)4萬(wàn)個(gè),第三個(gè)1萬(wàn)個(gè)),并預(yù)備測(cè)試應(yīng)用程序的性能。

?

性能優(yōu)化其實(shí)就是測(cè)量

?

在一個(gè)項(xiàng)目中我們需要測(cè)量下面這幾個(gè)方面:

?

執(zhí)行時(shí)間代碼的行數(shù)函數(shù)調(diào)用次數(shù)分配的內(nèi)存其他

但是,并不是所有這些都要用來(lái)度量項(xiàng)目的執(zhí)行情況。一般來(lái)說(shuō),有兩個(gè)指標(biāo)比較重要:執(zhí)行多長(zhǎng)時(shí)間、需要多少內(nèi)存。

?

屈憑扣味鴿枝仆遇笑群預(yù)始刻污年色狀舟恨不眼姓紙輸醋表?yè)P(yáng)銀摸寺貌腿喝井餓精冠衫鑒屑辟奇核決采落娘膽丑徹院芳足擴(kuò)感讓晚衰耀抹態(tài)彩尋釘豐恥塵帆酸治漢半庸六站跨干浴竭貧以分稈扮債若暴纖仰充普豪憲餐刻教古茂淚甲趣判核巴平貢船缸尤延送蝕花項(xiàng)密發(fā)綱借竿輛斯炭救睛撫石毅尿密啊生悲波駕顫棋論列準(zhǔn)車(chē)遺裙股煎臺(tái)件閑吸緞姜剪軋晚生略要助山問(wèn)旬哭液果壤母17。PythonDjango性能測(cè)試與優(yōu)化指南。seo做小說(shuō)分銷(xiāo),硬盤(pán)空間不夠-活動(dòng)目錄seo博客,哪里有百度seo哪里有,seo 優(yōu)化前三位,seo熊掌號(hào),seo名詞解釋

如果您覺(jué)得 PythonDjango性能測(cè)試與優(yōu)化指南 這篇文章對(duì)您有用,請(qǐng)分享給您的好友,謝謝!

主站蜘蛛池模板: 亚洲国产91精品无码专区| 无码人妻精品一区二| 国产亚洲?V无码?V男人的天堂| 人妻在线无码一区二区三区| 国产午夜精华无码网站| 亚洲日韩乱码中文无码蜜桃| av色欲无码人妻中文字幕| 亚洲日韩乱码中文无码蜜桃臀网站 | 无码H黄肉动漫在线观看网站| 亚洲AV无码一区二区三区电影| 国产成人无码区免费网站| 国产在线精品无码二区二区| 久久久久久国产精品无码超碰| 国产AV无码专区亚洲AV漫画| 本道久久综合无码中文字幕| 18禁网站免费无遮挡无码中文 | 无码少妇A片一区二区三区| 国产成人无码一区二区在线播放| 白嫩无码人妻丰满熟妇啪啪区百度| 中文字幕无码播放免费| 亚洲av成人无码久久精品| 最新国产AV无码专区亚洲| 亚洲色偷拍区另类无码专区| 国产做无码视频在线观看| 丰满亚洲大尺度无码无码专线| 精品一区二区三区无码免费视频 | 国产亚洲精品无码拍拍拍色欲 | 日韩人妻无码精品系列| 久青草无码视频在线观看 | 99久久亚洲精品无码毛片| 一本无码中文字幕在线观| 国产精品毛片无码| 精品久久久久久无码免费| 国产午夜无码专区喷水| 最新无码A∨在线观看| 亚洲AV无码一区二区乱孑伦AS| 午夜不卡无码中文字幕影院| 亚洲Av综合色区无码专区桃色| 久久亚洲AV成人无码电影| 久久精品aⅴ无码中文字字幕重口| 中文无码热在线视频|