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 isinstance判断对象类型
Sep 06 Python
零基础写python爬虫之神器正则表达式
Nov 06 Python
Python写的服务监控程序实例
Jan 31 Python
利用Python演示数型数据结构的教程
Apr 03 Python
Python 模拟登陆的两种实现方法
Aug 10 Python
Python Selenium 之关闭窗口close与quit的方法
Feb 13 Python
Pandas0.25来了千万别错过这10大好用的新功能
Aug 07 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
Sep 26 Python
django框架ModelForm组件用法详解
Dec 11 Python
Python使用jupyter notebook查看ipynb文件过程解析
Jun 02 Python
使用Python pip怎么升级pip
Aug 11 Python
python glom模块的使用简介
Apr 13 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中substr()与explode()函数用法分析
2014/11/24 PHP
ecshop实现smtp发送邮件
2015/02/03 PHP
php session_decode函数用法讲解
2019/05/26 PHP
Google Map Api和GOOGLE Search Api整合实现代码
2009/07/18 Javascript
JavaScript delete 属性的使用
2009/10/08 Javascript
js添加table的行和列 具体实现方法
2013/07/22 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
2015/09/30 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
2015/11/04 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
2016/11/29 Javascript
浅析上传头像示例及其注意事项
2016/12/14 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
Vue.js 插件开发详解
2017/03/29 Javascript
Vue中img的src属性绑定与static文件夹实例
2017/05/18 Javascript
Node.js控制台彩色输出的方法与原理实例详解
2019/12/01 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
vue-video-player视频播放器使用配置详解
2020/10/23 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
关于初始种子自动选取的区域生长实例(python+opencv)
2020/01/16 Python
Otel.com:折扣酒店预订
2017/08/24 全球购物
美国现代家具购物网站:LexMod
2019/01/09 全球购物
写给女生的道歉信
2014/01/14 职场文书
个人典型事迹材料
2014/12/30 职场文书
2015年保险业务员工作总结
2015/05/27 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
2016圣诞节贺卡寄语
2015/12/07 职场文书
大学军训口号大全
2015/12/24 职场文书
搭建Yolov5服务器
2022/04/30 Servers