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遍历目录的方法小结
Apr 28 Python
浅谈Python类的__getitem__和__setitem__特殊方法
Dec 25 Python
python实现日常记账本小程序
Mar 10 Python
运行django项目指定IP和端口的方法
May 14 Python
Python基于property实现类的特性操作示例
Jun 15 Python
python+os根据文件名自动生成文本
Mar 21 Python
安装PyInstaller失败问题解决
Dec 14 Python
python通过opencv实现图片裁剪原理解析
Jan 19 Python
多个python文件调用logging模块报错误
Feb 12 Python
pandas数据处理之绘图的实现
Jun 15 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
Feb 20 Python
Python软件包安装的三种常见方法
Jul 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
php 删除数组元素
2009/01/16 PHP
PHP中的float类型使用说明
2010/07/27 PHP
PHP操作XML作为数据库的类
2010/12/19 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
PHP getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
javascript 动态数据下的锚点错位问题解决方法
2008/12/24 Javascript
jquery下jstree简单应用 - v1.0
2011/04/14 Javascript
基于jQuery的倒计时实现代码
2012/05/30 Javascript
12款经典的白富美型—jquery图片轮播插件—前端开发必备
2013/01/08 Javascript
javascript创建和存储cookie示例
2014/01/07 Javascript
js 立即调用的函数表达式如何写
2014/01/12 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
基于JavaScript实现树形下拉框
2016/08/10 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
微信小程序 picker-view 组件详解及简单实例
2017/01/10 Javascript
vue利用better-scroll实现轮播图与页面滚动详解
2017/10/20 Javascript
node全局变量__dirname与__filename的区别
2019/01/14 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
在微信小程序中使用mqtt服务的方法
2019/12/13 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
Python实现注册登录系统
2017/08/08 Python
Python方法的延迟加载的示例代码
2017/12/18 Python
Python3.5内置模块之time与datetime模块用法实例分析
2019/04/27 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
德国旅行、体验和活动的预订平台:Watado
2019/12/04 全球购物
护理专业本科生自荐信
2013/10/01 职场文书
护士求职自荐信范文
2014/03/19 职场文书
毕业生就业协议书
2014/04/11 职场文书
护理心得体会范文
2016/01/22 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
Vue Mint UI mt-swipe的使用方式
2022/06/05 Vue.js