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实现基本进制转换的方法
Jul 11 Python
Windows下为Python安装Matplotlib模块
Nov 06 Python
python如何在终端里面显示一张图片
Aug 17 Python
Python3编程实现获取阿里云ECS实例及监控的方法
Aug 18 Python
python导出hive数据表的schema实例代码
Jan 22 Python
python3+PyQt5实现自定义分数滑块部件
Apr 24 Python
python http基本验证方法
Dec 26 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
Oct 09 Python
Python计算指定日期是今年的第几天(三种方法)
Mar 26 Python
利用scikitlearn画ROC曲线实例
Jul 02 Python
python调用有道智云API实现文件批量翻译
Oct 10 Python
用python写PDF转换器的实现
Oct 29 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去除二维数组的重复项方法
2015/11/03 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
toggle()隐藏问题的解决方法
2014/02/17 Javascript
基于javascript的JSON格式页面展示美化方法
2014/07/02 Javascript
jquery 实现两Select 标签项互调示例代码
2014/09/25 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
JS动态添加iframe的代码
2015/09/14 Javascript
Angularjs---项目搭建图文教程
2016/07/08 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
webpack 2.x配置reactjs基本开发环境详解
2017/08/08 Javascript
js微信应用场景之微信音乐相册案例分享
2017/08/11 Javascript
nodejs 使用 js 模块的方法实例详解
2018/12/04 NodeJs
babel7.x和webpack4.x配置vue项目的方法步骤
2019/05/12 Javascript
p5.js临摹动态图形实现方法详解
2019/10/23 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
JavaScript基于面向对象实现的无缝滚动轮播示例
2020/01/17 Javascript
vue 点击其他区域关闭自定义div操作
2020/07/17 Javascript
基于Python如何使用AIML搭建聊天机器人
2016/01/27 Python
python日志记录模块实例及改进
2017/02/12 Python
python处理Excel xlrd的简单使用
2017/09/12 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
python request 模块详细介绍
2020/11/10 Python
加拿大领先的冒险和户外零售商:Atmosphere
2017/12/19 全球购物
日本语毕业生自荐信
2014/02/01 职场文书
励志演讲稿范文
2014/04/29 职场文书
冬季施工防火方案
2014/05/17 职场文书
前台岗位职责
2015/02/13 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技