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爬虫之爬虫框架Scrapy安装配置
Nov 06 Python
Python实现处理逆波兰表达式示例
Jul 30 Python
python中正则表达式与模式匹配
May 07 Python
关于python字符串方法分类详解
Aug 20 Python
Django--权限Permissions的例子
Aug 28 Python
python 调试冷知识(小结)
Nov 11 Python
使用Python将Exception异常错误堆栈信息写入日志文件
Apr 08 Python
Django 解决新建表删除后无法重新创建等问题
May 21 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
Jul 03 Python
全面介绍python中很常用的单元测试框架unitest
Dec 14 Python
opencv python 对指针仪表读数识别的两种方式
Jan 14 Python
Python基础之pandas数据合并
Apr 27 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
JAVA/JSP学习系列之四
2006/10/09 PHP
让CodeIgniter的ellipsize()支持中文截断的方法
2014/06/12 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
在JavaScript中通过URL传递汉字的方法
2007/04/09 Javascript
js 页面执行时间计算代码
2009/03/04 Javascript
高效的表格行背景隔行变色及选定高亮的JS代码
2010/12/04 Javascript
jQuery(非HTML5)可编辑表格实现代码
2012/12/11 Javascript
js获取单选框或复选框值及操作
2012/12/18 Javascript
jQuery$命名冲突怎么办如何解决
2014/01/16 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
利用Python如何生成hash值示例详解
2017/12/20 Python
python爬取内容存入Excel实例
2019/02/20 Python
python实现趣味图片字符化
2019/04/30 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
2020/01/04 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
基于python实现文件加密功能
2020/01/06 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
解决Windows下python和pip命令无法使用的问题
2020/08/31 Python
澳洲Chemist Direct药房中文网:澳洲大型线上直邮药房
2019/11/04 全球购物
如何将字串String转换成整数int
2015/02/21 面试题
指针和引用有什么区别
2013/01/13 面试题
怎样写演讲稿
2014/01/04 职场文书
银行转正自我鉴定
2014/09/29 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
关于观后感的作文
2015/06/18 职场文书
前端学习——JavaScript原生实现购物车案例
2021/03/31 Javascript
uniapp开发小程序的经验总结
2021/04/08 Javascript
纯CSS实现hover图片pop-out弹出效果的实例代码
2021/04/16 HTML / CSS
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript