一、内容
最近看到一篇推送,讲python3.10版本支持了使用match case关键字来实现switch语句,switch语句的作用就是条件分支判断,比如:city = input("你想了解哪个城市的中超球队名字?")
match city:
case "北京":
print("北京国安")
case "成都":
print("成都蓉城")
case "广州":
print("广州恒大")
case _:
print("不知道")
其实一直比较疑惑,既然有了if else,为什么还会需要switch语句这样的语法呢?switch能做的,if else都能做,这不是多此一举吗?而且其他很多编译型语言也存在这样的语法,比如C,Java
查了一下资料,主要因为switch语句执行效率要更高
- if else语句在执行的时候采用的方法是按顺序比较,如满足条件,则执行对应的代码,否则跳转到下一个分支再进行比较,意味着在汇编指令层面会不断地调用cmp, jmp → cmp, jmp → cmp, jmp,时间复杂度o(n)
- 而switch语句在编译的时候会根据case分支创建了一个map表,运行的时候直接根据输入值(本文的例子是上文代码中的city变量)查map表,然后直接跳转,时间复杂度o(1)
if else的场景
但是在其他很多场景下,还是得用if else,比如:
- 区间值的判断,比如>=100、<25
- 复杂逻辑,(A and B) or C
switch的场景
- 固定值的条件分支
二、小结
- switch执行效率更高,属于典型的以空间换时间。也就是说,以提高空间复杂度为代价降低了时间复杂度。
三、号外
- 据说《C++ Footprint and Performance Optimization》这本书做了很多编译优化的测试,switch语句击中第三个选项的时间跟if/else if语句击中第三个选项的时间相同。击中第一,第二选项的速度if语句快,击中第四以及第四之后的选项的速度switch语句快。
- 所以,如果所有选项出现概率相同的话,结论就是:5个选项(包括default)的情况下,switch和if else相同。低于5个选项if快,高于5给选项switch快
发表回复