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的Bottle框架中获取制定cookie的教程
Apr 24 Python
Windows下为Python安装Matplotlib模块
Nov 06 Python
Python+Wordpress制作小说站
Apr 14 Python
Python简单生成随机数的方法示例
Mar 31 Python
Python异常的检测和处理方法
Oct 26 Python
基于python实现KNN分类算法
Apr 23 Python
TensorFlow梯度求解tf.gradients实例
Feb 04 Python
Python中私有属性的定义方式
Mar 05 Python
python3.6使用SMTP协议发送邮件
May 20 Python
Python 程序员必须掌握的日志记录
Aug 17 Python
python切割图片的示例
Nov 12 Python
详解Python生成器和基于生成器的协程
Jun 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
《心理测量者3》剧场版动画预告
2020/03/02 日漫
PHP实现提取一个图像文件并在浏览器上显示的代码
2012/10/06 PHP
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
PHP curl模拟登录带验证码的网站
2015/11/30 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
2016/03/10 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
2020/01/23 PHP
Cookie 小记
2010/04/01 Javascript
禁止js文件缓存的代码
2010/04/09 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
原生javascript实现的分页插件pagenav
2014/08/28 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
JS面试题---关于算法台阶的问题
2016/07/26 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
Nodejs实现多房间简易聊天室功能
2017/06/20 NodeJs
jQuery判断网页是否已经滚动到浏览器底部的实现方法
2017/10/27 jQuery
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
layui自定义ajax左侧三级菜单
2019/07/26 Javascript
Vue项目打包部署到iis服务器的配置方法
2019/10/14 Javascript
vue中beforeRouteLeave实现页面回退不刷新的示例代码
2019/11/01 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
[08:40]Navi Vs Newbee
2018/06/07 DOTA
Python的消息队列包SnakeMQ使用初探
2016/06/29 Python
Python复数属性和方法运算操作示例
2017/07/21 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
Python识别处理照片中的条形码
2020/11/16 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形
2013/01/09 HTML / CSS
台湾旅游网站:灿星旅游
2018/10/11 全球购物
英国复古服装购物网站:Collectif
2019/10/30 全球购物
公关活动策划方案
2014/05/25 职场文书
群众路线剖析材料(四风)
2014/11/05 职场文书
甜美蛋糕店的创业计划书模板,拿来即用!
2019/08/21 职场文书