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 过滤字符串的技巧,map与itertools.imap
Sep 06 Python
使用Python进行二进制文件读写的简单方法(推荐)
Sep 12 Python
python 根据pid杀死相应进程的方法
Jan 16 Python
python+pygame简单画板实现代码实例
Dec 13 Python
15行Python代码带你轻松理解令牌桶算法
Mar 21 Python
详解tensorflow载入数据的三种方式
Apr 24 Python
python 实时得到cpu和内存的使用情况方法
Jun 11 Python
解决python xlrd无法读取excel文件的问题
Dec 25 Python
python实现复制文件到指定目录
Oct 16 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
Dec 22 Python
Python生成器实现简单"生产者消费者"模型代码实例
Mar 27 Python
python数据抓取3种方法总结
Feb 07 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中动态HTML的输出技术
2006/10/09 PHP
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/21 PHP
php中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
php基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
jquery判断单个复选框是否被选中的代码
2009/09/03 Javascript
Javascript学习笔记9 prototype封装继承
2010/01/11 Javascript
基于jQuery替换table中的内容并显示进度条的代码
2011/08/02 Javascript
javascript学习笔记(十) js对象 继承
2012/06/19 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
浅谈vue权限管理实现及流程
2020/04/23 Javascript
微信小程序实现点赞业务
2021/02/10 Javascript
解决pycharm运行时interpreter为空的问题
2018/10/29 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
基于python实现操作redis及消息队列
2020/08/27 Python
python 求两个向量的顺时针夹角操作
2021/03/04 Python
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
公司道歉信范文
2014/01/09 职场文书
和平主题的演讲稿
2014/01/12 职场文书
优秀教师的感人事迹
2014/02/04 职场文书
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
市场总经理岗位职责
2014/04/11 职场文书
抗震救灾标语
2014/06/26 职场文书
本科毕业论文指导教师评语
2014/12/30 职场文书
幼儿园体操比赛口号
2015/12/25 职场文书
如何正确理解python装饰器
2021/06/15 Python
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis