国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python性能提升之延遲初始化

2020-02-23 04:09:10
字體:
來源:轉載
供稿:網友

所謂類屬性的延遲計算就是將類的屬性定義成一個property,只在訪問的時候才會計算,而且一旦被訪問后,結果將會被緩存起來,不用每次都計算。構造一個延遲計算屬性的主要目的是為了提升性能

property

在切入正題之前,我們了解下property的用法,property可以將屬性的訪問轉變成方法的調用。

class Circle(object):  def __init__(self, radius):   self.radius = radius    @property def area(self):   return 3.14 * self.radius ** 2  c = Circle(4) print c.radius print c.area

可以看到,area雖然是定義成一個方法的形式,但是加上@property后,可以直接執行c.area,當成屬性訪問。

現在問題來了,每次調用c.area,都會計算一次,太浪費cpu了,怎樣才能只計算一次呢?這就是lazy property

代碼實現

class LazyProperty(object): def __init__(self, func):  self.func = func def __get__(self, instance, owner):  if instance is None:   return self  else:   value = self.func(instance)   setattr(instance, self.func.__name__, value)   return valueimport mathclass Circle(object): def __init__(self, radius):  self.radius = radius @LazyProperty def area(self):  print 'Computing area'  return math.pi * self.radius ** 2 @LazyProperty def perimeter(self):  print 'Computing perimeter'  return 2 * math.pi * self.radius

說明

定義了一個延遲計算的裝飾器類LazyProperty。Circle是用于測試的類,Circle類有是三個屬性半徑(radius)、面積(area)、周長(perimeter)。面積和周長的屬性被LazyProperty裝飾,下面來試試LazyProperty的魔法:

>>> c = Circle(2)>>> print c.areaComputing area12.5663706144>>> print c.area12.5663706144

在area()中每計算一次就會打印一次“Computing area”,而連續調用兩次c.area后“Computing area”只被打印了一次。這得益于LazyProperty,只要調用一次后,無論后續調用多少次都不會重復計算。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乐昌市| 梁平县| 探索| 喀喇| 阿图什市| 平罗县| 灵武市| 淮安市| 孟津县| 浠水县| 铁岭县| 宣恩县| 嘉鱼县| 拜城县| 锡林浩特市| 东阿县| 梁河县| 樟树市| 广昌县| 内江市| 即墨市| 平南县| 团风县| 贵德县| 延庆县| 贞丰县| 普安县| 理塘县| 启东市| 汾阳市| 漠河县| 东乡| 都江堰市| 乐都县| 商丘市| 宁蒗| 太湖县| 梓潼县| 沽源县| 禹城市| 屏山县|