python用字典實現的switch方法是否真的比連續多個if速度快?

如題,把某個代碼用switch的方法重新實現了一下,但是測試速度是一樣的,如果速度真的這樣的話,寫switch好累的,還是我寫的有問題?

如圖

之前的連續11個if

因為需要傳參數,是 web應用,所以參數要等post請求,所以用lamdba緩存的函數


這種吧,最優雅的寫法是用註解

_registered_actions = {}

def action(name):
def decorator(f):
_registered_actions[name] = f
return f
return decorator

@action("getInfo")
def get_info(data):
...

@action("changeName")
def change_name(data):
...

def do_action(action_name, data):
try:
f = _registered_actions[action_name]
except KeyError:
return json.dumps(...)
else:
f(data)
...

它不會變快,它會讓你的代碼容易維護


如果是你這樣的字元串比較的話,用dict效率也好代碼可閱讀性也好都比一排if來的強……

但是,當然的,你的這段代碼寫得也難看……既然比較字元串裡面也沒有什麼奇怪的符號,為什麼不用dict的構造函數?

再進一步,為什麼要在分支里改寫data而不是在分支里構建data呢?

再再進一步,為什麼不把這些個改寫行為包裹成函數呢?

所以,這就是封裝了。

順帶一提,PEP應該會建議你在冒號後空格的……


這種寫法主要是可讀和容易維護,至於說效率比連續if快多少,則取決於你if和elif的工作量(數量以及單個判斷的時長,以及你是否按照輸入的概率來合理安排順序,比如某個key最可能出現,則放在最前面)

還是推薦第一種,維護性最重要,想要效率就別用純py,把核心module用c擴展弄下比這划算多了


在一個函數里用dict的{key:func}這種方式尚可,但用lambda 可讀性就很惆悵了。。

另外這個dict建議放在類定義里,

我的做法是首先在類定義里加上

allow_methods={"method1","method2"}構造一個集合

具體調用的時候,

if func_name in self.allow_methods:
func = getattr(self,"on_"+func_name)
func(...)


推薦閱讀:

剛開始接觸Python,如何正確高效的開展Python學習?
函數內部的變數在函數執行完後就銷毀,為什麼可變對象卻能保存上次調用時的結果呢??
Python 對異常與錯誤的處理策略,用 try...except,還是 if...else...,哪種比較好?
python numpy 數組如何對每個元素進行操作?
python 中如何實現一行輸入多個值 ?

TAG:Python | Python入門 |