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

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

 更新時間:2018年02月08日 15:08:00   作者:AngryBill  
這篇文章主要介紹了Python異常對代碼運(yùn)行性能的影響實(shí)例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下

前言

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

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

tip:

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

定義:

異常是一種跳出代碼塊的正??刂屏鱽硖幚礤e誤或者其它異常條件的方式。

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

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

缺點(diǎn):

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

結(jié)論:

異常必須遵守特定條件:

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

class Error(Exception):
  pass 

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

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

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

try:
  raise Error
except Error as error:
  pass

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

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

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

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ù)即可。

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

do_something:

def do_something():
  a = 1

我根據(jù)情況設(shè)計了不同的測試組:

測試組1(直接執(zhí)行耗時操作):

@timer
def test1():
  for _ in xrange(1000000):
    do_something()

測試組2(耗時操作放在try中執(zhí)行,不拋出錯誤):

@timer
def test2():
  try:
    for _ in xrange(1000000):
      do_something()
  except Exception:
    do_something()
  else:
    pass
  finally:
    pass

測試組3(try放耗時操作中,try每一次操作,不拋出錯誤):

@timer
def test3():
  for _ in xrange(1000000):
    try:
      do_something()
    except Exception:
      do_something()
    else:
      pass
    finally:
      pass

測試組4(try放耗時操作中,try每一次操作并進(jìn)行異常處理(捕捉拋出的特定異常)):

@timer
def test4():
  zero = 0
  for _ in xrange(1000000):
    try:
      if zero == 0:
        raise ZeroDivisionError
    except ZeroDivisionError:
      do_something()
    else:
      pass
    finally:
      pass

測試組5(try放耗時操作中,try每一次操作并進(jìn)行異常處理(捕捉所有異常 try…except BaseException)):

@timer
def test5():
  zero = 0
  for _ in xrange(1000000):
    try:
      if zero == 0:
        raise ZeroDivisionError
    except BaseException:
      do_something()
    else:
      pass
    finally:
      pass

測試組6(try放耗時操作中,try每一次操作并進(jìn)行異常處理(捕捉所有異常 不帶任何異常類型)):

@timer
def test6():
  zero = 0
  for _ in xrange(1000000):
    try:
      if zero == 0:
        raise ZeroDivisionError
    except:
      do_something()
    else:
      pass
    finally:
      pass

測試組7(耗時操作放在except中):

@timer
def test7():
  zero = 0
  try:
    if zero == 0:
      raise ZeroDivisionError
  except ZeroDivisionError:
    for _ in xrange(1000000):
      do_something()
  else:
    pass
  finally:
    pass

測試組8(防御式編碼):

@timer
def test8():
  zero = 0
  for _ in xrange(1000000):
    if zero == 0:
      do_something()

執(zhí)行結(jié)果

對比結(jié)論

  • 通過對比1和2,可以得知直接執(zhí)行耗時操作和耗時操作放在try中執(zhí)行并無異常觸發(fā)時性能消耗幾乎是一樣的。
  • 通過對比2和7,可以得知使用異常的使用無論是把代碼放在 try 中執(zhí)行還是在 except 中執(zhí)行性能消耗幾乎是一樣的。
  • 通過對比2和3,可以得知當(dāng)不拋出錯誤時,把try放耗時操作中比耗時操作放在try中性能消耗要略大。
  • 通過對比3和4,可以得知當(dāng)使用try時無異常拋出跟使用try時拋出異常性能消耗幾乎相差好幾倍。
  • 通過對比4和5,可以得知try放耗時操作中時,try每一次操作并進(jìn)行異常處理(捕捉拋出的特定異常)跟try每一次操作并進(jìn)行異常處理(捕捉所有異常 try…except BaseException)性能消耗幾乎是一樣的。
  • 通過對比4和8,可以得知使用防御性方式編碼比捕捉異常方式性能消耗幾乎相差好幾倍。
  • 通過對比5和6,可以得知捕捉所有異常(try…except)方式比捕捉所有異常(try…except BaseException)方式要略快。

總結(jié)

  1. 由以上對比結(jié)論,可以總結(jié)為:
  2. 無論是把代碼放在 try 中執(zhí)行還是在 except 中執(zhí)行性能消耗幾乎是一樣的。
  3. 直接執(zhí)行代碼與放在try中執(zhí)行且不拋出異常時性能消耗幾乎是一樣的,當(dāng)然理論上try會消耗一點(diǎn)性能,可以忽略不計。
  4. 雖然try…except的方式比try…except BaseException和捕捉拋出的特定異常的方式要略快,但扔不建議采取這種方式,因?yàn)榍罢吆苋菀纂[藏真正的bug,從而帶來嚴(yán)重后果。
  5. 通常要采取捕捉拋出的特定異常而不是捕捉所有異常,雖然二者性能消耗幾乎一樣。
  6. 防御性方式編碼比捕捉異常方式性能消耗幾乎相差好幾倍,應(yīng)盡量采取這種編程方式,提升性能并且更靠譜。

以上就是本文關(guān)于Python異常對代碼運(yùn)行性能的影響實(shí)例解析的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • 在Sublime Editor中配置Python環(huán)境的詳細(xì)教程

    在Sublime Editor中配置Python環(huán)境的詳細(xì)教程

    這篇文章主要介紹在sublime編輯器中安裝python軟件包,以 實(shí)現(xiàn)自動完成等功能,并在sublime編輯器本身中運(yùn)行build,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2020-05-05
  • 淺析Python中線程以及線程阻塞

    淺析Python中線程以及線程阻塞

    這篇文章主要為大家簡單介紹一下Python中線程以及線程阻塞的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下
    2023-04-04
  • Python入門教程(三十五)Python中文件的打開

    Python入門教程(三十五)Python中文件的打開

    這篇文章主要介紹了Python入門教程(三十五)Python中文件的打開,在Python中文件的讀取主要是用open()函數(shù),那么open()函數(shù)有哪些方法呢,今天我們就來看一看,需要的朋友可以參考下
    2023-05-05
  • Python批量轉(zhuǎn)換文件編碼格式

    Python批量轉(zhuǎn)換文件編碼格式

    需要將工作目錄下的文件進(jìn)行轉(zhuǎn)碼,開始的編碼是GBK的,需要將其轉(zhuǎn)換為utf-8的。文件較多,手動轉(zhuǎn)換肯定不行,用Python寫個腳本來實(shí)現(xiàn)。
    2015-05-05
  • 一文帶你掌握Python自然語言處理庫SpaCy

    一文帶你掌握Python自然語言處理庫SpaCy

    SpaCy是一個非常強(qiáng)大的Python自然語言處理庫,它包含了眾多強(qiáng)大功能,如詞性標(biāo)注、命名實(shí)體識別、依賴關(guān)系解析等等,這篇文章的目標(biāo)是幫助你了解SpaCy的基本功能和如何使用,需要的朋友可以參考下
    2023-07-07
  • Python去掉字符串中空格的方法

    Python去掉字符串中空格的方法

    這篇文章主要介紹了Python中去掉字符串中空格的方法,使用了strip()、lstrip()、rstrip()函數(shù),需要的朋友可以參考下
    2014-03-03
  • python numpy中setdiff1d的用法說明

    python numpy中setdiff1d的用法說明

    這篇文章主要介紹了python numpy中setdiff1d的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 使用python實(shí)現(xiàn)簡單五子棋游戲

    使用python實(shí)現(xiàn)簡單五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了使用python實(shí)現(xiàn)簡單五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • 使用jupyter notebook運(yùn)行python和R的步驟

    使用jupyter notebook運(yùn)行python和R的步驟

    這篇文章主要介紹了使用jupyter notebook運(yùn)行python和R的步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Python3使用matplotlib繪圖時,坐標(biāo)軸刻度不從X軸、y軸兩端開始

    Python3使用matplotlib繪圖時,坐標(biāo)軸刻度不從X軸、y軸兩端開始

    這篇文章主要介紹了Python3使用matplotlib繪圖時,坐標(biāo)軸刻度不從X軸、y軸兩端開始問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評論

兖州市| 尉犁县| 巴林左旗| 奈曼旗| 许昌市| 阿城市| 乌拉特后旗| 梁河县| 元江| 景谷| 济南市| 麟游县| 徐汇区| 嘉峪关市| 大姚县| 锦州市| 榆林市| 大同县| 永年县| 五台县| 聂拉木县| 阳泉市| 晋州市| 纳雍县| 宁波市| 合作市| 邓州市| 谢通门县| 乐陵市| 二连浩特市| 龙胜| 卢湾区| 磐安县| 玉山县| 博白县| 柏乡县| 定远县| 外汇| 报价| 堆龙德庆县| 松江区|