Python性能提升之延迟初始化


Posted in Python onDecember 04, 2016

所谓类属性的延迟计算就是将类的属性定义成一个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,只要调用一次后,无论后续调用多少次都不会重复计算。

Python 相关文章推荐
Python的MongoDB模块PyMongo操作方法集锦
Jan 05 Python
理解生产者消费者模型及在Python编程中的运用实例
Jun 26 Python
Scrapy的简单使用教程
Oct 24 Python
使用python实现链表操作
Jan 26 Python
Python3.5.3下配置opencv3.2.0的操作方法
Apr 02 Python
Python画图高斯分布的示例
Jul 10 Python
Python math库 ln(x)运算的实现及原理
Jul 17 Python
python使用flask与js进行前后台交互的例子
Jul 19 Python
python SVD压缩图像的实现代码
Nov 05 Python
pytorch中的inference使用实例
Feb 20 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
Jan 28 Python
浅析python连接数据库的重要事项
Feb 22 Python
python中redis的安装和使用
Dec 04 #Python
Python正则表达式使用范例分享
Dec 04 #Python
Python常用库推荐
Dec 04 #Python
Python 正则表达式的高级用法
Dec 04 #Python
简单谈谈Python流程控制语句
Dec 04 #Python
python中正则的使用指南
Dec 04 #Python
win与linux系统中python requests 安装
Dec 04 #Python
You might like
推荐几部必看的DC动画电影
2020/03/03 欧美动漫
短波收音机简介
2021/03/01 无线电
jQuery contains过滤器实现精确匹配使用方法
2013/04/12 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
jQuery html()方法使用不了无法显示内容的问题
2014/08/06 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
2016/09/19 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
AngularJS 打开新的标签页实现代码
2017/09/07 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
在Python的web框架中配置app的教程
2015/04/30 Python
深入理解python中的select模块
2017/04/23 Python
Python生成rsa密钥对操作示例
2019/04/26 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
什么是python的必选参数
2020/06/21 Python
详解Python多线程下的list
2020/07/03 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
收集的7个CSS3代码生成工具
2010/04/17 HTML / CSS
css3 flex布局 justify-content:space-between 最后一行左对齐
2020/01/02 HTML / CSS
澳大利亚在线购买儿童玩具:Toy Universe
2017/12/28 全球购物
土木工程实习生自我鉴定
2013/09/19 职场文书
个人简历自我评价八例
2013/10/31 职场文书
工程管理造价应届生求职信
2013/11/13 职场文书
计算机专业毕业生求职信分享
2013/12/24 职场文书
家长会主持词
2014/03/26 职场文书
政府班子四风问题整改措施
2014/10/04 职场文书
学习与创新自我评价
2015/03/09 职场文书
web前端之css水平居中代码解析
2021/05/20 HTML / CSS
Java并发编程之原子性-Atomic的使用
2022/03/16 Java/Android