国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python功能點實現:函數級/代碼塊級計時器

2020-02-16 00:27:16
字體:
來源:轉載
供稿:網友

工程中我們常常需要對某一個函數或者一塊代碼計時,從而監測系統關鍵位置的性能。計時方法是在代碼塊前后分別記錄當前系統時間,然后兩者相減得到代碼塊的耗時。最簡單原始的實現類似:

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

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

基于裝飾器的函數級計時器

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

具體實現如下:

from datetime import datetimedef 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@timerdef test_1(a):  '''Function Level'''  a *= 2  return aif __name__ == '__main__':  print(test_1(1))

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

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 荥经县| 郁南县| 深水埗区| 墨玉县| 民勤县| 资源县| 社旗县| 睢宁县| 辽宁省| 南阳市| 静海县| 乌海市| 泌阳县| 滨州市| 永春县| 翁牛特旗| 平顺县| 涞源县| 丰宁| 酉阳| 金寨县| 孟连| 绩溪县| 邛崃市| 高要市| 噶尔县| 建昌县| 双鸭山市| 玉树县| 阜平县| 商洛市| 山西省| 临江市| 弥渡县| 乐昌市| 张掖市| 门头沟区| 新安县| 仁怀市| 惠东县| 隆回县|