【问题标题】:Performance difference in alternative switches in PythonPython 中替代开关的性能差异
【发布时间】:2009-11-07 05:29:10
【问题描述】:

我已经阅读了几篇关于 Python 中 switch 语句替代方案的文章。主要使用字典而不是大量的 if 和 elif。然而,没有人真正回答这个问题:有没有更好的性能或效率?我已经阅读了一些论点,即 if 和 elif 必须检查每个语句,并且在使用许多 if 和 elif 时会变得低效。然而,使用 dicts 可以解决这个问题,但你最终不得不创建新的模块来调用,这无论如何都会取消性能提升。最终唯一的区别是可读性。

任何人都可以对此发表评论,从长远来看真的有什么不同吗?有没有人经常使用替代品?我问的唯一原因是因为我最终将拥有 30-40 个 elif/if 并且将来可能更多。任何输入表示赞赏。谢谢。

【问题讨论】:

  • 有一些很好的建议,还有一些关于性能的讨论,stackoverflow.com/questions/60208/…
  • “在许多 if 和 elif 中变得低效” 在浪费任何时间之前,您必须提供一些实际证据证明这变得可以实际衡量。此外,维护人员的成本通常是软件中最昂贵的部分。优化未来程序员的时间。
  • 我对此做了一些测试。我正在编写一个解释器,并且使用大型 if 语句来执行指令是两个主要瓶颈之一。

标签: python performance switch-statement


【解决方案1】:

dict 的性能通常是无与伦比的,因为对 dict 的查找将是 O(1),除非在极少数且几乎从未观察到的情况下(其中键涉及用户编码的类型带有糟糕的散列;-)。你不必像你说的那样“创建新模块”,只是任意的可调用对象,并且创建,它只执行一次来准备字典,无论如何不是特别昂贵 - 在操作期间,这只是一次查找和一次调用,油腻的闪电时间。

正如其他人所建议的那样,尝试timeit 来试验一些替代品的微型基准。我的预测:正如你提到的那样,有几十种可能性在发挥作用,你会拍打你的额头,因为你会考虑任何可调用的字典!-)

如果您发现运行自己的基准测试太难并且可以提供一些规格,我想我们可以为您提供基准替代方案,但如果您在寻求帮助之前自己尝试这样做会更有指导意义!-)

【讨论】:

    【解决方案2】:

    您关心的应该是代码的可读性和可维护性,而不是其效率。这适用于大多数情况,尤其是您现在描述的情况。效率差异可能可以忽略不计(您可以使用少量基准测试代码轻松检查它),但 30-40 个 elif 是一个警告信号 - 也许可以抽象出一些东西并使代码更具可读性。描述一下你的情况,也许有人能想出更好的设计。

    【讨论】:

    • 不是这个问题的真正答案。在许多应用程序中,多路分支是不可避免的,并且其性能很重要(例如解释器)。
    【解决方案3】:

    对于所有性能/分析问题,正确的答案是“针对您的特定需求自行测试每个案例。”

    一个很好的工具是timeit,您可以了解in the python docs

    总的来说,我没有看到与使用字典代替其他语言 switch 语句相关的性能问题。我的猜测是,性能比较将取决于替代品的数量。谁知道呢,可能会有一个转折点,让一个变得比另一个更好。

    如果您(或其他任何人)对其进行测试,请随时发布您的结果。

    【讨论】:

      【解决方案4】:

      当您在多种语言中使用 switch 时,您会在 Python 中使用 dict。如果将 switch 语句添加到 Python 中(已经考虑过),无论如何都无法提供任何真正的性能提升。

      dicts 在 Python 中无处不在。 CPython dicts 是一种极其高效、健壮的哈希表实现。查找是 O(1),而不是遍历一个 elif 链,它是 O(n)。 (无论如何,30-40 可能还不够大,足以影响吨数)。我不确定您对创建要调用的新模块是什么意思,但是使用 dicts 非常可扩展且容易。

      至于实际的性能增益,这是不可能真正抽象地有效解决的。以最直接和可维护的方式编写代码(您正在使用 Python forgoshsakes!),然后查看它是否太慢。如果是,请对其进行分析并找出需要加速的地方才能产生真正的影响。

      【讨论】:

        【解决方案5】:

        我认为随着案例数量的增加,dict 将获得优于 if 语句的替代序列的优势,因为键查找只需要一个哈希操作。否则,如果您只有几个案例,那么几个if 语句会更好。对于您正在做的事情,dict 可能是一个更优雅的解决方案。无论哪种方式,在您的情况下,性能差异都不会真正明显。

        【讨论】:

          【解决方案6】:

          我运行了一些基准测试(请参阅 here)。如果您的键是连续整数,则使用函数指针列表最快。对于一般情况:Alex Martelli 是对的,字典是最快的。

          【讨论】:

            猜你喜欢
            • 2013-04-09
            • 2019-12-04
            • 2021-07-25
            • 2011-08-08
            • 1970-01-01
            • 2023-04-09
            • 2020-09-04
            • 2015-10-28
            相关资源
            最近更新 更多