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

首頁 > 編程 > Python > 正文

Python異常對(duì)代碼運(yùn)行性能的影響實(shí)例解析

2020-02-22 23:10:34
字體:
供稿:網(wǎng)友

前言

Python的異常處理能力非常強(qiáng)大,但是用不好也會(huì)帶來負(fù)面的影響。我平時(shí)寫程序的過程中也喜歡使用異常,雖然采取防御性的方式編碼會(huì)更好,但是交給異常處理會(huì)起到偷懶作用。偶爾會(huì)想想異常處理會(huì)對(duì)性能造成多大的影響,于是今天就試著測試了一下。

Python異常(谷歌開源風(fēng)格指南)

tip:

允許使用異常, 但必須小心。

定義:

異常是一種跳出代碼塊的正常控制流來處理錯(cuò)誤或者其它異常條件的方式。

優(yōu)點(diǎn):

正常操作代碼的控制流不會(huì)和錯(cuò)誤處理代碼混在一起. 當(dāng)某種條件發(fā)生時(shí), 它也允許控制流跳過多個(gè)框架. 例如, 一步跳出N個(gè)嵌套的函數(shù), 而不必繼續(xù)執(zhí)行錯(cuò)誤的代碼。

缺點(diǎn):

可能會(huì)導(dǎo)致讓人困惑的控制流. 調(diào)用庫時(shí)容易錯(cuò)過錯(cuò)誤情況。

結(jié)論:

異常必須遵守特定條件:

像這樣觸發(fā)異常: raise MyException("Error message") 或者 raise MyException . 不要使用兩個(gè)參數(shù)的形式( raise MyException, "Error message" )或者過時(shí)的字符串異常( raise "Error message" )。
模塊或包應(yīng)該定義自己的特定域的異常基類, 這個(gè)基類應(yīng)該從內(nèi)建的Exception類繼承. 模塊的異常基類應(yīng)該叫做”Error”。

class Error(Exception):  pass 

永遠(yuǎn)不要使用 except: 語句來捕獲所有異常, 也不要捕獲 Exception 或者 StandardError , 除非你打算重新觸發(fā)該異常, 或者你已經(jīng)在當(dāng)前線程的最外層(記得還是要打印一條錯(cuò)誤消息). 在異常這方面, Python非常寬容, except: 真的會(huì)捕獲包括Python語法錯(cuò)誤在內(nèi)的任何錯(cuò)誤. 使用 except: 很容易隱藏真正的bug。

盡量減少try/except塊中的代碼量. try塊的體積越大, 期望之外的異常就越容易被觸發(fā). 這種情況下, try/except塊將隱藏真正的錯(cuò)誤。

使用finally子句來執(zhí)行那些無論try塊中有沒有異常都應(yīng)該被執(zhí)行的代碼. 這對(duì)于清理資源常常很有用, 例如關(guān)閉文件。
當(dāng)捕獲異常時(shí), 使用 as 而不要用逗號(hào). 例如

try:  raise Errorexcept Error as error:  pass

設(shè)計(jì)實(shí)驗(yàn)方式

采取比較簡單直觀的對(duì)照實(shí)驗(yàn)。

先定義一個(gè)裝飾器,用來計(jì)算每個(gè)函數(shù)執(zhí)行所需時(shí)間:

def timer(func):  import time  def wrapper(*args, **kwargs):    startTime = time.time()    f = func(*args, **kwargs)    endTime = time.time()    passTime = endTime - startTime    print "執(zhí)行函數(shù)%s使用了%f秒" % (getattr(func, "__name__"), passTime)    return f  return wrapper

然后用該裝飾器裝飾測試的函數(shù)即可。

再定義一個(gè)叫do_something的函數(shù),這個(gè)函數(shù)中就做一件事,把1賦值給變量a。在每個(gè)測試函數(shù)中,都會(huì)調(diào)用這個(gè)函數(shù)1000000次。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 临洮县| 如皋市| 盘山县| 佛教| 万州区| 弋阳县| 光泽县| 福州市| 瑞丽市| 遵化市| 九江市| 探索| 深水埗区| 凯里市| 汉寿县| 龙海市| 鄂托克旗| 惠水县| 辽阳县| 敦煌市| 定南县| 麻城市| 临潭县| 延吉市| 杂多县| 银川市| 托里县| 阜新市| 普兰县| 金溪县| 东辽县| 西安市| 济南市| 西藏| 大关县| 绥滨县| 苏尼特左旗| 盐城市| 治多县| 鄂州市| 马尔康县|