Python中不同交换机的性能差异

4 投票
6 回答
1532 浏览
提问于 2025-04-15 15:45

我看过一些关于在Python中替代switch语句的文章。主要是用字典来代替很多的if和elif。不过没有一篇真正回答这个问题:哪种方法在性能或效率上更好?我看到一些观点说,if和elif需要逐个检查每个条件,当条件很多的时候就会变得效率低下。而用字典可以避免这个问题,但你最终还是得创建新的模块来调用,这样反而会抵消性能上的提升。最后的区别只是可读性。

有没有人能对此发表意见,从长远来看真的有区别吗?有没有人经常使用这种替代方法?我之所以问这个,是因为我将来可能会有30到40个elif或if,甚至更多。任何建议都很感谢。谢谢。

6 个回答

3

对于所有关于性能或分析的问题,正确的答案是“根据你的具体需求自己测试每种情况。”

一个很好的工具是 timeit,你可以在 Python文档中了解它。

一般来说,我没有看到使用字典代替其他语言的 switch 语句会有性能问题。我的猜测是,性能的比较可能取决于选择的数量。谁知道呢,也许会有一个临界点,让其中一个变得比另一个更好。

如果你(或者其他人)测试过,欢迎分享你的结果。

6

你应该关注代码的可读性和可维护性,而不是它的效率。这在大多数情况下都是适用的,尤其是在你现在描述的情况中。效率上的差别可能微乎其微(你可以用一些简单的测试代码来验证这一点),但是如果有30到40个elif语句,那就要注意了——这可能意味着可以把某些东西抽象出来,让代码更容易理解。描述一下你的情况,也许有人能提出更好的设计方案。

8

dict的性能通常是无与伦比的,因为查找一个dict里的内容基本上是O(1)的时间复杂度,除了极少数几乎不会遇到的情况(比如键是用户自己定义的类型,且哈希函数设计得很糟糕)。你不需要像你说的那样“创建新的模块”,只需要一些可以调用的函数就行,而这个创建过程只需要进行一次来准备dict,而且这个过程其实并不费劲——在实际操作中,只需要一次查找和一次调用,速度快得像闪电一样。

正如其他人建议的,试试timeit来对比一下不同方案的性能。我预测:在你提到的几十种可能性中,你会后悔曾经考虑过除了dict以外的任何选择!-)

如果你觉得自己跑基准测试太难,而又能提供一些规格,我想我们可以帮你测试其他方案,但如果你能自己先试试再来问SO,那会更有帮助!-)

撰写回答