国产探花免费观看_亚洲丰满少妇自慰呻吟_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,只要調用一次后,無論后續調用多少次都不會重復計算。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 贵港市| 繁昌县| 绵阳市| 疏附县| 古丈县| 清水县| 新干县| 科技| 个旧市| 邯郸市| 桓仁| 石狮市| 修水县| 浦城县| 巨鹿县| 丹寨县| 沙坪坝区| 凯里市| 汉寿县| 洞口县| 诏安县| 永兴县| 江华| 景东| 顺义区| 伊通| 临高县| 常德市| 石泉县| 青铜峡市| 杂多县| 雷波县| 卢氏县| 孟津县| 平山县| 沙洋县| 中宁县| 延川县| 宣城市| 仲巴县| 靖江市|