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解析最简单的验证码
Jan 07 Python
深入理解python中函数传递参数是值传递还是引用传递
Nov 07 Python
python3写爬取B站视频弹幕功能
Dec 22 Python
python画出三角形外接圆和内切圆的方法
Jan 25 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
Jan 29 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
深入学习python多线程与GIL
Aug 26 Python
python pillow模块使用方法详解
Aug 30 Python
python画微信表情符的实例代码
Oct 09 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
Jan 20 Python
Django中文件上传和文件访问微项目的方法
Apr 27 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 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网页游戏学习之Xnova(ogame)源码解读(十四)
2014/06/26 PHP
PHP中echo,print_r与var_dump区别分析
2014/09/29 PHP
php限制ip地址范围的方法
2015/03/31 PHP
typecho插件编写教程(二):写一个新插件
2015/05/28 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
Javascript中的匿名函数与封装介绍
2015/03/15 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
2015/07/28 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
javascript滚轮事件基础实例讲解(37)
2017/02/14 Javascript
让Vue也可以使用Redux的方法
2018/05/23 Javascript
微信小程序如何获取手机验证码
2018/11/04 Javascript
[01:19]2014DOTA2国际邀请赛 采访TITAN战队ohaiyo 能赢DK很幸运
2014/07/12 DOTA
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
Python中实现对list做减法操作介绍
2015/01/09 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
2018/12/19 Python
OpenCV 边缘检测
2019/07/10 Python
pytorch打印网络结构的实例
2019/08/19 Python
利用setuptools打包python程序的方法步骤
2020/01/18 Python
Python操作dict时避免出现KeyError的几种解决方法
2020/09/20 Python
通过实例解析python and和or使用方法
2020/11/14 Python
python3字符串输出常见面试题总结
2020/12/01 Python
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
PHP如何去执行一个SQL语句
2016/03/05 面试题
读书心得体会
2013/12/28 职场文书
小学家长会邀请函
2014/01/23 职场文书
高中微机老师自我鉴定
2014/02/16 职场文书
企业消防安全责任书
2014/07/23 职场文书
中学生运动会广播稿
2015/08/19 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
pytorch中的model=model.to(device)使用说明
2021/05/24 Python