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安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 Python
Python处理字符串之isspace()方法的使用
May 19 Python
python脚本内运行linux命令的方法
Jul 02 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
Mar 23 Python
对python pandas 画移动平均线的方法详解
Nov 28 Python
Pytorch的mean和std调查实例
Jan 02 Python
Python3读取和写入excel表格数据的示例代码
Jun 09 Python
Python爬虫实例——爬取美团美食数据
Jul 15 Python
python动态规划算法实例详解
Nov 22 Python
利用Python将多张图片合成视频的实现
Nov 23 Python
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
Apr 12 Python
请求模块urllib之PYTHON爬虫的基本使用
Apr 08 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
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
php之curl实现http与https请求的方法
2014/10/21 PHP
PHP7.0安装笔记整理
2015/08/28 PHP
YII使用url组件美化管理的方法
2015/12/28 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
php微信公众号开发之翻页查询
2018/10/20 PHP
一款由jquery实现的整屏切换特效
2014/09/15 Javascript
基于jQuery实现的文字按钮表单特效整理
2014/12/07 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
freemarker判断对象是否为空的方法
2015/08/13 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
jQuery密码强度验证控件使用详解
2017/01/05 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
移动端触摸滑动插件swiper使用方法详解
2017/08/11 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
p5.js实现动态图形临摹
2019/10/23 Javascript
vue实现跳转接口push 转场动画示例
2019/11/01 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
Python利用operator模块实现对象的多级排序详解
2017/05/09 Python
浅析Git版本控制器使用
2017/12/10 Python
python中自带的三个装饰器的实现
2019/11/08 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
LTD Commodities:礼品,独特发现,家居装饰,家用器皿
2017/08/11 全球购物
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
鼓励运动员的广播稿
2014/02/08 职场文书
大学新生军训感言
2014/02/25 职场文书
机械机修工岗位职责
2014/08/03 职场文书
2014年节能降耗工作总结
2014/12/11 职场文书
基石观后感
2015/06/12 职场文书
python实现局部图像放大
2021/11/17 Python