Python性能提升之延迟初始化

 更新时间:2016年12月04日 11:45:30   投稿:hebedich  
本文给大家分享的是在Python中使用延迟计算来提升性能的方法,非常的实用,有需要的小伙伴可以参考下

所谓类属性的延迟计算就是将类的属性定义成一个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,只要调用一次后,无论后续调用多少次都不会重复计算。

相关文章

  • PyCharm配置mongo插件的方法

    PyCharm配置mongo插件的方法

    今天小编就为大家分享一篇PyCharm配置mongo插件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Python并发编程协程(Coroutine)之Gevent详解

    Python并发编程协程(Coroutine)之Gevent详解

    这篇文章主要介绍了Python并发编程协程(Coroutine)之Gevent详解,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12
  • python Selenium爬取内容并存储至MySQL数据库的实现代码

    python Selenium爬取内容并存储至MySQL数据库的实现代码

    这篇文章主要介绍了python Selenium爬取内容并存储至MySQL数据库的实现代码,需要的朋友可以参考下
    2017-03-03
  • Python ollama的搭建与使用流程分析

    Python ollama的搭建与使用流程分析

    这篇文章主要介绍了Python ollama的搭建与使用流程分析,详细介绍了ollama的安装方式,本文结合实例给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • python中使用(.)进行相对路径访问文件的操作方法

    python中使用(.)进行相对路径访问文件的操作方法

    在Python中,使用相对路径访问文件是一种常见的做法,尤其是在处理与脚本位于同一目录或附近目录的文件时,这篇文章主要介绍了python中使用(.)来进行相对路径访问文件,需要的朋友可以参考下
    2024-05-05
  • 深度学习之GPU,CUDA和cuDNN的理解

    深度学习之GPU,CUDA和cuDNN的理解

    Cuda和cudnn是支持NVIDIA支持GPU的两个库,分别用于高性能计算和深度神经网络计算的支持,下面这篇文章主要给大家介绍了关于深度学习之GPU,CUDA和cuDNN的理解,需要的朋友可以参考下
    2023-02-02
  • PyCharm专业最新版2019.1安装步骤(含激活码)

    PyCharm专业最新版2019.1安装步骤(含激活码)

    这篇文章主要介绍了PyCharm专业最新版2019.1安装步骤(含激活码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Python深入浅出分析enum枚举类

    Python深入浅出分析enum枚举类

    在python中枚举是一种类(Enum,IntEnum),存放在enum模块中。枚举类型可以给一组标签赋予一组特定的值,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • PyTorch中Torch.arange函数详解

    PyTorch中Torch.arange函数详解

    PyTorch是由Facebook开发的开源机器学习库,它用于深度神经网络和自然语言处理,下面这篇文章主要给大家介绍了关于PyTorch中Torch.arange函数详解的相关资料,需要的朋友可以参考下
    2023-02-02
  • Python使用文件锁实现进程间同步功能【基于fcntl模块】

    Python使用文件锁实现进程间同步功能【基于fcntl模块】

    这篇文章主要介绍了Python使用文件锁实现进程间同步功能,结合实例形式分析了Python基于fcntl模块文件锁功能实现进程间同步的相关操作技巧,需要的朋友可以参考下
    2017-10-10

最新评论