美文网首页Python开发技术
利用Python延迟初始化提升性能

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

作者: PyChina | 来源:发表于2016-11-25 20:20 被阅读281次

来源: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室(近北新桥地铁站)

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

详情请点击此处

相关文章

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

    来源:Python中文社区 所谓类属性的延迟计算就是将类的属性定义成一个property,只在访问的时候才会计算,...

  • app启动加速

    1.在 Application 中做初始化:利用异步延迟初始化,或者延迟到 Activity 中初始化。 2.在 ...

  • 通用应用启动加速套路?

    利用主题快速显示界面; ** 异步初始化组件;** ** 梳理业务逻辑,延迟初始化组件、操作;** ** 正确使用...

  • EffectiveJava第十章第六节

    慎用延迟初始化 延迟初始化作为一种性能优化的技巧,它要求类的域成员在第一次访问时才执行必要的初始化动作,而不是在类...

  • python 延迟加载

    延迟加载的目的: 节省一些初始化所需要的时间和空间Python里面的延迟加载用得非常多,其主要思想是延迟所要引入类...

  • python 性能提升

  • 来自搜狗输入法的IOS性能优化建议

    一、性能优化建议 1.懒加载 – 延迟加载 – 不需要的对象不立即初始化,需要用到时才初始化 – 重写对象的get...

  • Java对象延迟初始化的实现

    一、什么是延迟初始化? 在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销。延迟初始化...

  • Python最慢!C最快!Python+C混编?结果可想而知!

    Python 代码的行数总是更少,Python比较慢,但其牺牲性能可以提升工作效率。 当您最终遇到 Python ...

  • 多线程

    多线程使用场景: 主要是提升性能,降低延迟,提高吞吐量。 最佳线程数原则:将硬件的性能发挥到极致。 最佳线程数 =...

网友评论

    本文标题:利用Python延迟初始化提升性能

    本文链接:https://www.haomeiwen.com/subject/oprwpttx.html