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实现生成用户信息
Mar 20 Python
python编程之requests在网络请求中添加cookies参数方法详解
Oct 25 Python
python3获取两个日期之间所有日期,以及比较大小的实例
Apr 08 Python
Python爬虫框架scrapy实现的文件下载功能示例
Aug 04 Python
Python 支付整合开发包的实现
Jan 23 Python
python使用正则筛选信用卡
Jan 27 Python
python3中替换python2中cmp函数的实现
Aug 20 Python
Python Sympy计算梯度、散度和旋度的实例
Dec 06 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
Jun 08 Python
keras 多gpu并行运行案例
Jun 10 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
Jun 17 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
Mar 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
中国的第一台收音机
2021/03/01 无线电
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
深入理解PHP中的Streams工具
2015/07/03 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
2013/12/31 Javascript
Jquery中的层次选择器与find()的区别示例介绍
2014/02/20 Javascript
微信小程序 教程之注册页面
2016/10/17 Javascript
bootstrap导航、选项卡实现代码
2016/12/28 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
微信小程序HTTP接口请求封装的实现
2019/02/21 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
详解Vue3 Teleport 的实践及原理
2020/12/02 Vue.js
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
使用python装饰器验证配置文件示例
2014/02/24 Python
python中的set实现不重复的排序原理
2018/01/24 Python
Python输入二维数组方法
2018/04/13 Python
利用Python实现在同一网络中的本地文件共享方法
2018/06/04 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
html5标记文字_动力节点Java学院整理
2017/07/11 HTML / CSS
伦敦眼门票在线预订:London Eye
2018/05/31 全球购物
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
计算机系毕业生推荐信
2013/11/06 职场文书
物业电工岗位职责
2013/11/20 职场文书
幼儿园校车司机的岗位职责
2014/01/30 职场文书
元宵节主持词
2014/03/25 职场文书
大学生社团活动总结
2014/04/26 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
房展策划方案
2014/06/07 职场文书
教师党员批评与自我批评
2014/10/15 职场文书
2015年仓库管理员工作总结
2015/04/21 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
OpenCV 图像梯度的实现方法
2021/07/25 Python