switch的python實現
來自專欄 python編程
我們知道,python是沒有switch語句的,所以當我們要實現這樣結構的邏輯時:
var index = 10switch index { case 100 : print( "index 的值為 100") case 10,15 : print( "index 的值為 10 或 15") case 5 : print( "index 的值為 5") default : print( "默認 case")}
經常需要用多個if-else來實現。除此之外,我們還可以考慮用字典對應提取的方式來實現,下面我們給出四種實現switch的方法,並對比這四種方法的運行時間
something = something# 第一種,多次使用if-else結構if something == this: the_thing = 1elif something == that: the_thing = 2elif something == there: the_thing = 3else: the_thing = 4# 第二種,用get設置默認值的字典提取options = {this: 1, that: 2, there: 3}the_thing = options.get(something, 4)# 第三種,用if-else配合不設置默認值的字典提取options = {this: 1, that: 2, there: 3}if something in options: the_thing = options[something]else: the_thing = 4# 第四種,用collections模塊設置默認值進行字典提取from collections import defaultdictdefault_options = defaultdict(lambda: 4, {this: 1, that: 2, there: 3})the_thing = default_options[something]
下面我們對比一下這幾種方式提取的速度,分成兩種情況
- 判斷的內容在字典中
- 判斷的內容不在字典中
在ifelse.py文件中輸入如下內容
import timefrom collections import defaultdict# 計算運行時間的裝飾器def run_time(func): def wrapper(*args, **kw): start = time.time() func(*args, **kw) end = time.time() print(running, end-start, s) return wrapper# 準備好兩個字典options = {this: 1, that: 2, there: 3}default_options = defaultdict(lambda: 4, {this: 1, that: 2, there: 3})# 四種方法都定義成函數# 接受參數something即待判斷值# 每次循環10000000次@run_timedef first(something): for i in range(10000000): if something == this: the_thing = 1 elif something == that: the_thing = 2 elif something == there: the_thing = 3 else: the_thing = 4@run_timedef second(something): for i in range(10000000): the_thing = options.get(something, 4)@run_timedef third(something): for i in range(10000000): if something in options: the_thing = options[something] else: the_thing = 4@run_timedef forth(something): for i in range(10000000): the_thing = default_options[something]# 調用函數if __name__ == __main__: # 判斷的內容不在字典中 first(something) second(something) third(something) forth(something) print(-*20) # 判斷的內容在字典中 first(this) second(this) third(this) forth(this)
在命令行多次運行
python ifelse.py
得到結果如下
-------------第一次---------------running 1.8487958908081055 srunning 1.63755202293396 srunning 0.7807505130767822 srunning 0.6786513328552246 s--------------------running 0.7807483673095703 srunning 2.075996160507202 srunning 1.0349910259246826 srunning 0.740731954574585 s-------------第二次---------------running 1.7757258415222168 srunning 1.6395549774169922 srunning 0.8408102989196777 srunning 0.7977871894836426 s--------------------running 0.710662841796875 srunning 1.9098539352416992 srunning 1.042982578277588 srunning 0.8197875022888184 s-------------第三次---------------running 1.5885050296783447 srunning 1.8237719535827637 srunning 0.9819226264953613 srunning 0.78375244140625 s--------------------running 0.6226155757904053 srunning 1.634549617767334 srunning 0.947911262512207 srunning 0.6586313247680664 s
從結果中可以看出
1.四種方法之間的對比,後兩種方法明顯比前兩種方法快,且最後一種方法總是最快的。
2.待判斷內容是否在字典中設置的對比- 第一種全程if-else判斷的情況下,早判斷出來程序就會早結束,所以if-else判斷的內容順序是有講究的
- 而從字典里提取則沒有看出顯著的不同
由於使用collections模塊中的defaultdict雖然最快,但是會佔用較多內存,所以最推薦的是第三種方法,使用if-else配合無默認字典提取方法。
參考資料:
Most efficient way of making an if-elif-elif-else statement when the else is done the most?專欄信息
專欄主頁:python編程
專欄目錄:目錄
版本說明:軟體及包版本說明
推薦閱讀:
※如何讓你的Python 代碼一直運行著
※你真的了解Python中的日期時間處理嗎?
※Python黑帽編程 3.3 MAC洪水攻擊
※python基礎篇 (11) pycharm簡單配置
※Python Shell 中敲擊方向鍵顯示「^[[C^[[D」,原因是什麼?如何修復?