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删除指定目录下过期文件的2个脚本分享
Apr 10 Python
浅谈python为什么不需要三目运算符和switch
Jun 17 Python
Python整型运算之布尔型、标准整型、长整型操作示例
Jul 21 Python
python书籍信息爬虫实例
Mar 19 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
Mar 19 Python
浅析Python装饰器以及装饰器模式
May 28 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
python selenium实现发送带附件的邮件代码实例
Dec 10 Python
Python使用pdb调试代码的技巧
May 03 Python
Opencv求取连通区域重心实例
Jun 04 Python
pytorch实现ResNet结构的实例代码
May 17 Python
PO模式在selenium自动化测试框架的优势
Mar 20 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
2020显卡排行榜天梯图 显卡天梯图2020年3月最新版
2020/04/02 数码科技
PHP ajax 分页类代码
2008/11/13 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
PHP 实现base64编码文件上传出现问题详解
2020/09/01 PHP
URL地址中的#符号使用说明
2011/02/12 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
2014/07/10 Javascript
js QQ客服悬浮效果实现代码
2014/12/12 Javascript
JS判断客服QQ号在线还是离线状态的方法
2015/01/13 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
2016/05/25 Javascript
jQuery+HTML5+CSS3制作支持响应式布局时间轴插件
2016/08/10 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
js获取元素下的第一级子元素的方法(推荐)
2017/03/05 Javascript
基于JavaScript实现微信抢红包功能
2017/07/20 Javascript
小程序scroll-view组件实现滚动的示例代码
2018/09/20 Javascript
用vscode开发vue应用的方法步骤
2019/05/06 Javascript
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
Python3读取UTF-8文件及统计文件行数的方法
2015/05/22 Python
Python学习笔记之if语句的使用示例
2017/10/23 Python
Python实现希尔排序算法的原理与用法实例分析
2017/11/23 Python
名片管理系统python版
2018/01/11 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
2019/12/26 Python
写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
2014/09/05 面试题
大学生物业管理求职信
2013/10/24 职场文书
幼儿园开学家长寄语
2014/01/19 职场文书
《三袋麦子》教学反思
2014/03/02 职场文书
2014年个人委托书范本
2014/10/13 职场文书
荆州古城导游词
2015/02/06 职场文书
2015应届毕业生自荐信范文
2015/03/05 职场文书
调解书格式范本
2015/05/20 职场文书
医者仁心观后感
2015/06/17 职场文书
CocosCreator入门教程之网络通信
2021/04/16 Javascript
Mysql8.0递归查询的简单用法示例
2021/08/04 MySQL
ubuntu端向日葵键盘输入卡顿问题及解决
2022/12/24 Servers