欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學堂Python培訓簡述Python功能點實現(xiàn)函數(shù)級/代碼塊級計時器

2019-04-25 10:42:44 2828瀏覽

Python功能點實現(xiàn)函數(shù)級/代碼塊級計時器開發(fā)有沒有還不清楚的小伙伴?本篇文章扣丁學堂Python培訓小編就給讀者們分享一下Python功能點實現(xiàn)函數(shù)級/代碼塊級計時器,文中有代碼列出供大家參考,有不錯的參考價值,感興趣的小伙伴就隨小編來了解一下吧。


扣丁學堂Python培訓簡述Python功能點實現(xiàn)函數(shù)級/代碼塊級計時器


工程中我們常常需要對某一個函數(shù)或者一塊代碼計時,從而監(jiān)測系統(tǒng)關(guān)鍵位置的性能。計時方法是在代碼塊前后分別記錄當前系統(tǒng)時間,然后兩者相減得到代碼塊的耗時。最簡單原始的實現(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))


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



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


第一種計時器是比較常見的函數(shù)級計時器,通過裝飾器完成,將原函數(shù)改裝成擁有計時功能的新函數(shù),使其可以完成運行原來函數(shù)和計時兩件事。在使用時,只用在需要計時功能的函數(shù)代碼前加上類似@timer的語法糖,這樣每次調(diào)用原函數(shù)時,運行的將會是新函數(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))


基于上下文的代碼塊級計時器


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


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


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


在這個基礎(chǔ)上,我們還可以做出一個裝飾器timer_來實現(xiàn)基于上下文的函數(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))


更靈活的實現(xiàn)


更優(yōu)雅地,我們還可以使用contextlib自帶的ContextDecorator,參考官方示例,做出既可以with又可以作為裝飾器的計時器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)

最后想要了解更多關(guān)于Python和人工智能方面內(nèi)容的小伙伴,請關(guān)注扣丁學堂Python培訓官網(wǎng)、微信等平臺,扣丁學堂IT職業(yè)在線學習教育平臺為您提供權(quán)威的Python開發(fā)環(huán)境搭建視頻,Python培訓后的前景無限,行業(yè)薪資和未來的發(fā)展會越來越好的,扣丁學堂老師精心推出的Python視頻教程定能讓你快速掌握Python從入門到精通開發(fā)實戰(zhàn)技能??鄱W堂Python技術(shù)交流群:279521237。


扣丁學堂微信公眾號                          Python全棧開發(fā)爬蟲人工智能機器學習數(shù)據(jù)分析免費公開課直播間


      【關(guān)注微信公眾號獲取更多學習資料】         【掃碼進入Python全棧開發(fā)免費公開課】



查看更多關(guān)于"Python開發(fā)資訊"的相關(guān)文章>


標簽: Python培訓 Python視頻教程 Python在線視頻 Python學習視頻 Python培訓班

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號-2   Copyright ? 2017 - 2022
返回頂部 返回頂部