switch和if else的区别

一、内容

最近看到一篇推送,讲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快
柚子

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Index