最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python功能點(diǎn)實(shí)現(xiàn):函數(shù)級(jí)/代碼塊級(jí)計(jì)時(shí)器

 更新時(shí)間:2019年01月02日 11:26:46   作者:27Up  
今天小編就為大家分享一篇關(guān)于Python功能點(diǎn)實(shí)現(xiàn):函數(shù)級(jí)/代碼塊級(jí)計(jì)時(shí)器,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧

工程中我們常常需要對(duì)某一個(gè)函數(shù)或者一塊代碼計(jì)時(shí),從而監(jiān)測(cè)系統(tǒng)關(guān)鍵位置的性能。計(jì)時(shí)方法是在代碼塊前后分別記錄當(dāng)前系統(tǒng)時(shí)間,然后兩者相減得到代碼塊的耗時(shí)。最簡(jiǎn)單原始的實(shí)現(xiàn)類似:

from datetime import datetime
start = datetime.now()
# some code you want to measure
end = datetime.now()
print("Processing time for {} is: {} seconds".format('You Name It', elapse))

這種方式缺點(diǎn)明顯:假如系統(tǒng)內(nèi)有很多地方都需要計(jì)時(shí),那么每個(gè)地方都需要插入這樣的計(jì)時(shí)代碼,首先是重復(fù)性工作很麻煩,其次這樣會(huì)降低代碼的可讀性,干擾對(duì)業(yè)務(wù)邏輯的理解。本文將給出一些更好的實(shí)現(xiàn),主要涉及的技術(shù)是裝飾器(Decorator)和運(yùn)行時(shí)上下文(runtime context)。

基于裝飾器的函數(shù)級(jí)計(jì)時(shí)器

第一種計(jì)時(shí)器是比較常見的函數(shù)級(jí)計(jì)時(shí)器,通過裝飾器完成,將原函數(shù)改裝成擁有計(jì)時(shí)功能的新函數(shù),使其可以完成運(yùn)行原來函數(shù)和計(jì)時(shí)兩件事。在使用時(shí),只用在需要計(jì)時(shí)功能的函數(shù)代碼前加上類似@timer的語法糖,這樣每次調(diào)用原函數(shù)時(shí),運(yùn)行的將會(huì)是新函數(shù)。這樣就大大減少了重復(fù)性勞動(dòng)。

具體實(shí)現(xiàn)如下:

from datetime import datetime
def timer(func):
  '''Function Level Timer via Decorator'''
  def timed(*args, **kwargs):
    start = datetime.now()
    result = func(*args, **kwargs)
    end = datetime.now()
    elapse = (end - start).total_seconds()
    print("Processing time for {} is: {} seconds".format(func.__name__, elapse))
    return result
  return timed
@timer
def test_1(a):
  '''Function Level'''
  a *= 2
  return a
if __name__ == '__main__':
  print(test_1(1))

基于上下文的代碼塊級(jí)計(jì)時(shí)器

裝飾器實(shí)現(xiàn)的計(jì)時(shí)器可以為函數(shù)添加計(jì)時(shí)功能,可以滿足大部分情況的需要,但是假如我們想要更靈活一些,對(duì)任意一段連續(xù)的代碼塊做計(jì)時(shí),怎樣做?使用原始的插計(jì)時(shí)代碼的方法顯然不是我們想要的;也可以將代碼塊重構(gòu)成一個(gè)函數(shù),再在上面加裝飾器,然而這就顯得不夠優(yōu)雅。因此我做出了下面的實(shí)現(xiàn)。

首先了解上下文管理的概念。大致是說Python中允許創(chuàng)建一種叫上下文管理器(Context Manager)的對(duì)象,它可以管理一個(gè)代碼塊執(zhí)行時(shí)的上下文信息。具體的方法是創(chuàng)建一個(gè)類,并為其實(shí)現(xiàn)object.__enter__和object.__exit__方法,前者在進(jìn)入代碼塊時(shí)自動(dòng)執(zhí)行,后者在完成代碼塊執(zhí)行時(shí)自動(dòng)執(zhí)行。

在使用時(shí),通過with和as關(guān)鍵字,將__enter__的返回值綁定到某一個(gè)變量名,這個(gè)返回值里可以儲(chǔ)存代碼塊運(yùn)行過程中得到的一些信息,在這里就是運(yùn)行時(shí)間啦。具體的實(shí)現(xiàn)是創(chuàng)建一個(gè)計(jì)時(shí)器類Timer,在enter時(shí)記錄代碼塊運(yùn)行的開始時(shí)間,exit時(shí)記錄完成時(shí)間、計(jì)算并儲(chǔ)存耗時(shí)到Timer實(shí)例中。在使用時(shí),將with Timer() as t加到要計(jì)時(shí)的代碼塊前面,t.elapse中將會(huì)儲(chǔ)存代碼塊耗時(shí),可以任意使用。

在這個(gè)基礎(chǔ)上,我們還可以做出一個(gè)裝飾器timer_來實(shí)現(xiàn)基于上下文的函數(shù)級(jí)計(jì)時(shí)器。

具體實(shí)現(xiàn)如下:

class Timer(object):
  '''Code Block Level Timer via Context'''
  def __enter__(self):
    self.start = datetime.now()
    return self
  def __exit__(self, *args):
    self.end = datetime.now()
    self.elapse = (self.end - self.start).total_seconds()
def timer_(func):
  '''Function Level Timer via Context & with Statement'''
  def timed(*args, **kw):
    with Timer() as t:
      result = func(*args, **kw)
    print("Processing time for {} is: {} seconds".format(func.__name__, t.elapse))
    return result
  return timed
def test_2(a):
  '''Code Block Level'''
  with Timer() as t:
    a *= 2
  print("Processing time for {} is: {} seconds".format('You Name It', t.elapse))
  return a
@timer_
def test_3(a):
  '''Function Level'''
  a *= 2
  return a
if __name__ == '__main__':
  print(test_2(2))
  print(test_3(3))

更靈活的實(shí)現(xiàn)

更優(yōu)雅地,我們還可以使用contextlib自帶的ContextDecorator,參考官方示例,做出既可以with又可以作為裝飾器的計(jì)時(shí)器timer_elegant:

from datetime import datetime
from contextlib import ContextDecorator
class timer_elegant(ContextDecorator):
  '''Elegant Timer via ContextDecorator'''
  def __init__(self, name):
    self.name = name
  def __enter__(self):
    self.start = datetime.now()
  def __exit__(self, *args):
    self.end = datetime.now()
    self.elapse = (self.end - self.start).total_seconds()
    print("Processing time for {} is: {} seconds".format(self.name, self.elapse))
@timer_elegant('test_4')
def test_4(a):
  a *= 2
  return a
def test_5(a):
  a *= 2
  return a
if __name__ == '__main__':
  print(test_4(4))
 
  with timer_elegant('test 5'):
    result_5 = test_5(5)
  print(result_5)

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • Python?tkinter中四個(gè)常用按鈕的用法總結(jié)

    Python?tkinter中四個(gè)常用按鈕的用法總結(jié)

    tkinter中有四個(gè)控件被冠以Button之名,分別是:Button,?Checkbutton,?Radiobutton,?Menubutton,下面小編就來和大家聊聊它們的具體用法,感興趣的可以學(xué)習(xí)一下
    2023-09-09
  • python利用urllib和urllib2訪問http的GET/POST詳解

    python利用urllib和urllib2訪問http的GET/POST詳解

    urllib模塊提供的上層接口,使我們可以像讀取本地文件一樣讀取www和ftp上的數(shù)據(jù)。下面這篇文章主要給大家介紹了關(guān)于python如何利用urllib和urllib2訪問http的GET/POST的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • python爬取Ajax動(dòng)態(tài)加載網(wǎng)頁(yè)過程解析

    python爬取Ajax動(dòng)態(tài)加載網(wǎng)頁(yè)過程解析

    這篇文章主要介紹了python爬取Ajax動(dòng)態(tài)加載網(wǎng)頁(yè)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 自制Python淘寶秒殺搶購(gòu)腳本雙十一百分百中

    自制Python淘寶秒殺搶購(gòu)腳本雙十一百分百中

    年年雙十一,年年搶不到,今年小編自制Python淘寶秒殺搶購(gòu)腳本,百分百中,下面小編把我的實(shí)現(xiàn)思路分享給大家,有興趣的朋友借鑒下吧
    2021-11-11
  • Python下singleton模式的實(shí)現(xiàn)方法

    Python下singleton模式的實(shí)現(xiàn)方法

    這篇文章主要介紹了Python下singleton模式的實(shí)現(xiàn)方法,有一定的借鑒價(jià)值,需要的朋友可以參考下
    2014-07-07
  • 詳解Django中ORM查詢的改進(jìn)方案與說明

    詳解Django中ORM查詢的改進(jìn)方案與說明

    這篇文章主要為大家詳細(xì)介紹了Django中ORM查詢的改進(jìn)方案與具體說明,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • Python+unittest+requests+excel實(shí)現(xiàn)接口自動(dòng)化測(cè)試框架

    Python+unittest+requests+excel實(shí)現(xiàn)接口自動(dòng)化測(cè)試框架

    這篇文章主要介紹了Python+unittest+requests+excel實(shí)現(xiàn)接口自動(dòng)化測(cè)試框架,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Python性能分析工具Profile使用實(shí)例

    Python性能分析工具Profile使用實(shí)例

    這篇文章主要介紹了Python性能分析工具Profile使用實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Django中Migrate和Makemigrations實(shí)操詳解

    Django中Migrate和Makemigrations實(shí)操詳解

    這篇文章主要為大家介紹了Django中Migrate和Makemigrations實(shí)操詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 解決keras模型保存h5文件提示無此目錄問題

    解決keras模型保存h5文件提示無此目錄問題

    這篇文章主要介紹了解決keras模型保存h5文件提示無此目錄問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07

最新評(píng)論

天津市| 吐鲁番市| 新和县| 景德镇市| 德格县| 茶陵县| 昂仁县| 临西县| 龙游县| 宕昌县| 广饶县| 稷山县| 五华县| 桐庐县| 封开县| 斗六市| 祁连县| 皋兰县| 肥东县| 江阴市| 繁峙县| 垫江县| 梅河口市| 栾城县| 涞源县| 临江市| 富锦市| 东乌| 潮安县| 西充县| 武定县| 东明县| 汶上县| 托里县| 枞阳县| 淳化县| 洪江市| 利辛县| 彭阳县| 辉县市| 荔波县|