欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python性能提升之延遲初始化

 更新時(shí)間:2016年12月04日 11:45:30   投稿:hebedich  
本文給大家分享的是在Python中使用延遲計(jì)算來提升性能的方法,非常的實(shí)用,有需要的小伙伴可以參考下

所謂類屬性的延遲計(jì)算就是將類的屬性定義成一個(gè)property,只在訪問的時(shí)候才會(huì)計(jì)算,而且一旦被訪問后,結(jié)果將會(huì)被緩存起來,不用每次都計(jì)算。構(gòu)造一個(gè)延遲計(jì)算屬性的主要目的是為了提升性能

property

在切入正題之前,我們了解下property的用法,property可以將屬性的訪問轉(zhuǎn)變成方法的調(diào)用。

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雖然是定義成一個(gè)方法的形式,但是加上@property后,可以直接執(zhí)行c.area,當(dāng)成屬性訪問。

現(xiàn)在問題來了,每次調(diào)用c.area,都會(huì)計(jì)算一次,太浪費(fèi)cpu了,怎樣才能只計(jì)算一次呢?這就是lazy property

代碼實(shí)現(xiàn)

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

說明

定義了一個(gè)延遲計(jì)算的裝飾器類LazyProperty。Circle是用于測試的類,Circle類有是三個(gè)屬性半徑(radius)、面積(area)、周長(perimeter)。面積和周長的屬性被LazyProperty裝飾,下面來試試LazyProperty的魔法:

>>> c = Circle(2)
>>> print c.area
Computing area
12.5663706144
>>> print c.area
12.5663706144

在area()中每計(jì)算一次就會(huì)打印一次“Computing area”,而連續(xù)調(diào)用兩次c.area后“Computing area”只被打印了一次。這得益于LazyProperty,只要調(diào)用一次后,無論后續(xù)調(diào)用多少次都不會(huì)重復(fù)計(jì)算。

相關(guān)文章

  • 詳解Python中的普通函數(shù)和高階函數(shù)

    詳解Python中的普通函數(shù)和高階函數(shù)

    這篇文章主要為大家介紹了Python中的普通函數(shù)和高階函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Python Django教程之模型中字段驗(yàn)證詳解

    Python Django教程之模型中字段驗(yàn)證詳解

    這篇文章主要為大家詳細(xì)介紹了Python Django如何對(duì)模型中的字段進(jìn)行驗(yàn)證,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下
    2022-10-10
  • Python字典底層實(shí)現(xiàn)原理詳解

    Python字典底層實(shí)現(xiàn)原理詳解

    今天小編就為大家分享一篇Python字典底層實(shí)現(xiàn)原理詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python使用xmlrpc實(shí)例講解

    python使用xmlrpc實(shí)例講解

    這篇文章主要介紹了python中使用xmlrpc的實(shí)例,大家參考使用吧
    2013-12-12
  • Python如何在DataFrame增加數(shù)值

    Python如何在DataFrame增加數(shù)值

    這篇文章主要介紹了Python如何在DataFrame增加數(shù)值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python實(shí)現(xiàn)識(shí)別圖片內(nèi)容的方法分析

    Python實(shí)現(xiàn)識(shí)別圖片內(nèi)容的方法分析

    這篇文章主要介紹了Python實(shí)現(xiàn)識(shí)別圖片內(nèi)容的方法,結(jié)合實(shí)例形式分析了tesseract模塊的下載、安裝配置及使用tesseract模塊進(jìn)行圖片識(shí)別的相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • python語言是免費(fèi)還是收費(fèi)的?

    python語言是免費(fèi)還是收費(fèi)的?

    在本篇文章里小編給大家分享的是關(guān)于python語言是否免費(fèi)的相關(guān)知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • Python3使用Matplotlib 繪制精美的數(shù)學(xué)函數(shù)圖形

    Python3使用Matplotlib 繪制精美的數(shù)學(xué)函數(shù)圖形

    這篇文章主要介紹了Python3使用Matplotlib 繪制精美的數(shù)學(xué)函數(shù)圖形,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • Python學(xué)習(xí)之pip包管理工具的使用

    Python學(xué)習(xí)之pip包管理工具的使用

    學(xué)習(xí)?Python?的過程中,經(jīng)常會(huì)使用?pip?命令去安裝第三方模塊。pip?是?Python?默認(rèn)集成的包管理工具,而其本質(zhì)就是?Python?標(biāo)準(zhǔn)庫中的一個(gè)包,只是比較特殊一些。本文就來為你你全面揭示一下?pip?包管理工具的使用
    2022-08-08
  • Python入門必須知道的11個(gè)知識(shí)點(diǎn)

    Python入門必須知道的11個(gè)知識(shí)點(diǎn)

    這篇文章主要為大家詳細(xì)介紹了Python入門必須知道的11個(gè)知識(shí)點(diǎn),幫助更好地了解python,感興趣的小伙伴們可以參考一下
    2018-03-03

最新評(píng)論