利用Python延迟初始化提升性能

来源:Python中文社区

所谓类属性的延迟计算就是将类的属性定义成一个property,只在访问的时候才会计算,而且一旦被访问后,结果将会被缓存起来,不用每次都计算
所谓类属性的延迟计算就是将类的属性定义成一个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 value
import math
class 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.area
Computing area
12.5663706144
>>> print c.area
12.5663706144

在area()中每计算一次就会打印一次“Computing area”,而连续调用两次c.area后“Computing area”只被打印了一次。这得益于LazyProperty,只要调用一次后,无论后续调用多少次都不会重复计算。


PyChina将联合JetBrain(出品PyCharm的公司)一起在北京举办一次Python沙龙活动。

时间:11月26日晚上19:00-21:00

地点:科技寺北新桥 北京市东城区东四北大街107号科林大厦B座107室(近北新桥地铁站)

欢迎大家报名参加本次活动,特别需要志愿者来帮忙组织本次活动。

详情请点击此处

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,082评论 19 139
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,923评论 1 10
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,242评论 6 13
  • 阿良是家里的二儿子,他的哥哥隽平是一名医生也是父亲诊所的继承人,却在一次救援中不幸溺亡。因而这一家人约定,每年在隽...
    安濑聖阅读 512评论 0 0
  • 伪代码(pseudocode)是一种算法描述语言,能够使被描述的算法能够被各种编程语言实现,作用可以参考数学里的公...
    喜欢萝莉的逗逼青年阅读 2,049评论 0 51