返回頂部
關閉軟件導航
位置:首頁 > 技術分享 > SEO優化>PythonDjango性能測試與優化指南

唐納德·克努特(DonaldKnuth)曾經說過:“不成熟的優化方案是萬惡之源。”然而,任何一個承受高負載的成熟項目都不可避免地需要進行優化。在本文中,我想談談優化Web項目代碼的五種常用方法。雖然本文是以Django為例,但其他框架和語言的優化原則也是類似的。通過使用這些優化方法,文中例程的查詢響應時間從原來的77秒減少到了3.7秒。

?

本文用到的例程是從一個我曾經使用過的真實項目改編而來的,是性能優化技巧的典范。假如你想自己嘗試著進行優化,可以在GitHub上獲取優化前的初始代碼,并跟著下文做相應的修改。我使用的是Python2,因為一些第三方軟件包還不支持Python3。

?

示例代碼介紹

PythonDjango性能測試與優化指南

?

這個Web項目只是簡單地跟蹤每個地區的房產價格。因此,只有兩種模型:

#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提供了一個繼續自模型并包含hash屬性的模型,這個屬性包含了實例的主鍵和模型的內容類型。這能夠隱藏像實例ID這樣的敏感數據,而用散列進行代替。假如項目中有多個模型,而且需要在一個集中的地方對模型進行解碼并要對不同類的不同模型實例進行處理時,這可能會非常有用。請注重,對于本文的這個小項目,即使不用散列也照樣可以處理,但使用散列有助于展示一些優化技巧。

?

這是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來提供這些數據,所以我們安裝了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)

?

現在,我們將用一些數據來填充數據庫(使用factory-boy生成10萬個房屋的實例:一個地區5萬個,另一個4萬個,第三個1萬個),并預備測試應用程序的性能。

?

性能優化其實就是測量

?

在一個項目中我們需要測量下面這幾個方面:

?

執行時間代碼的行數函數調用次數分配的內存其他

但是,并不是所有這些都要用來度量項目的執行情況。一般來說,有兩個指標比較重要:執行多長時間、需要多少內存。

?

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

如果您覺得 PythonDjango性能測試與優化指南 這篇文章對您有用,請分享給您的好友,謝謝!

主站蜘蛛池模板: 中文无码伦av中文字幕| 中文字幕av无码一区二区三区电影| 成人毛片无码一区二区| 精品久久久久久无码免费| 精品无人区无码乱码毛片国产| 无码少妇一区二区三区| 精品无码成人久久久久久| 午夜福利av无码一区二区| 国产乱子伦精品无码专区| 无码日韩人妻av一区免费| 少妇无码AV无码专区在线观看| 国产精品无码久久av| 无码无需播放器在线观看| 无码人妻丝袜在线视频| 亚洲A∨无码无在线观看| 欧洲精品无码一区二区三区在线播放| 最新无码人妻在线不卡| 日韩人妻无码一区二区三区99 | 久久无码av三级| 亚洲AV无码成H人在线观看| 亚洲AV无码资源在线观看| 亚洲国产超清无码专区| 无码区国产区在线播放| 亚洲AV无码专区国产乱码4SE| 国产av无码专区亚洲国产精品| 久久久久久久久无码精品亚洲日韩 | 亚洲一区无码中文字幕乱码| 亚洲AV无码久久精品蜜桃| 高潮潮喷奶水飞溅视频无码| 寂寞少妇做spa按摩无码| 亚洲永久无码3D动漫一区| 国产aⅴ无码专区亚洲av| 亚洲精品无码国产| 亚洲AV无码1区2区久久| 亚洲国产成人精品无码区在线秒播| 日韩人妻无码中文字幕视频| 亚洲精品久久无码av片俺去也| 人妻少妇看A偷人无码精品视频| 午夜麻豆国产精品无码 | 亚洲精品97久久中文字幕无码 | 亚洲国产成人无码AV在线|