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动态加载变量示例分享
Feb 17 Python
使用Python的Twisted框架编写简单的网络客户端
Apr 16 Python
用Python遍历C盘dll文件的方法
May 06 Python
python3 pillow生成简单验证码图片的示例
Sep 19 Python
Python温度转换实例分析
Jan 17 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
Dec 04 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 Python
python 利用jinja2模板生成html代码实例
Oct 10 Python
python类中super() 的使用解析
Dec 19 Python
Django如何实现密码错误报错提醒
Sep 04 Python
Python使用pickle进行序列化和反序列化的示例代码
Sep 22 Python
matplotlib相关系统目录获取方式小结
Feb 03 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
PHP如何透过ODBC来存取数据库
2006/10/09 PHP
基于mysql的bbs设计(五)
2006/10/09 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
测试PHP连接MYSQL成功与否的代码
2013/08/16 PHP
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
php实现阳历阴历互转的方法
2015/10/28 PHP
几行代码轻松实现PHP文件打包下载zip
2017/03/01 PHP
判断控件是否已加载完成的代码
2010/02/24 Javascript
javaScript实现浮点数转十六进制字符
2013/10/29 Javascript
将list转换为json失败的原因
2013/12/17 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
jQuery满屏焦点图左右滚动特效代码分享
2015/09/07 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
2017/04/16 Javascript
基于JavaScript实现无缝滚动效果
2017/07/21 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
使用Python下载Bing图片(代码)
2013/11/07 Python
python打开文件并获取文件相关属性的方法
2015/04/23 Python
python获取文件扩展名的方法
2015/07/06 Python
基于python log取对数详解
2018/06/08 Python
Django数据库类库MySQLdb使用详解
2019/04/28 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
2020/02/11 Python
python画环形图的方法
2020/03/25 Python
python cookie反爬处理的实现
2020/11/01 Python
建筑工地宣传标语
2014/06/18 职场文书
应聘教师求职信
2014/07/19 职场文书
领导班子四风对照检查材料
2014/09/23 职场文书
python 下载文件的几种方式分享
2021/04/07 Python
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python