【问题标题】:Optimal loop function exit最优循环函数退出
【发布时间】:2019-10-28 08:53:07
【问题描述】:

假设有一个没有返回任何内容的函数,其中有一个循环。在某些时候必须完成函数调用(在循环中)。要清楚循环总是会迭代多次。有两种方法可以做到这一点:

1.用break结束循环:

def func():
    while True:
        do_smth....
        if condition:
            break

2。立即使用 return 结束函数调用:

def func():
    while True:
        do_smth....
        if condition:
            return

这些函数的实际作用应该没有区别,但哪种方式更有效?

【问题讨论】:

  • 您的示例太有限,无法真正说出总体上最好的方法。在您给定的示例中,最佳解决方案根本不是循环,因为它会在一次迭代后退出
  • 如果你有一个真正的案例,这实际上会产生任何重大差异,我会感到震惊...... :) 请记住,它是 Python。保持简单,不要尝试预先优化。
  • 虽然一般不建议使用 true。大多数情况下不建议休息。如果函数什么都不返回,它不应该返回任何东西。问题和代码太笼统了。您在那里写的内容可以(并且应该)重构为while not condition: do_smth。但这是基本编程,与 python 或中断/返回效率无关,顺便说一句,这不应该对您的代码产生影响。无论如何,func() 是否在另一个循环中?
  • 是的,那么“正确的方法”就不是他们俩了。他们都错了。您可以在一些非常特殊的情况下看到这种变通方法,在这些情况下,替代方法更糟(就大多数情况下的可读性而言)。您编写的两个示例都会导致代码难以辨认,而且往往会导致错误。无论如何,就性能而言,“最佳”选项是不可能的,因为您在这里没有衡量什么都没有的大 O。至于其余的,经验法则:避免这种模式。还要检查zen
  • @MikeMajara 说得很好!

标签: python function loops


【解决方案1】:

使用 timeit.timeit 运行 'count to 10' 循环 1000 万次表明直接 return 运行速度稍快,因此可能应该是要走的路。

【讨论】:

    【解决方案2】:

    这两种方法的区别在于它们的用途继承。

    break 语句用于循环内部,并在到达break 时停止迭代。

    return 语句用于停止函数执行并返回一个值。

    时间上的差异是由于到达break/return时启动的程序;你可以看到,在指令级别,语句做了不同的事情 -> 导致不同的时间:

    import dis
    
    def x():
        while True:
            return
    
    def y():
        while True:
            break
    
    
    print(dis.dis(x))
    print(dis.dis(y))
    

    输出是: 对于x

    4           0 SETUP_LOOP               4 (to 6)
    
      5           2 LOAD_CONST               0 (None)
                  4 RETURN_VALUE
            >>    6 LOAD_CONST               0 (None)
                  8 RETURN_VALUE
    

    对于y

      8           0 SETUP_LOOP               6 (to 8)
    
      9     >>    2 BREAK_LOOP
                  4 JUMP_ABSOLUTE            2
                  6 POP_BLOCK
            >>    8 LOAD_CONST               0 (None)
                 10 RETURN_VALUE
    

    所以很明显,如果您只是比较 dummy 示例中的差异,您给出的 return 会更快。

    【讨论】:

    • 够清楚了。但是,是否真的有循环假人?除了我们正在谈论的一个之外,所有行都将以相同的方式以相同的时间执行。猜猜它只是更少的文字)。
    • @D.Moiseev 这取决于你想让循环做什么;它不会总是那么简单。但只是为了这个而不是简单的while True,你发布了它就可以了
    【解决方案3】:

    Optimal 用于描述代码的最佳性能(大 O 表示法)。唯一可以合理回答问题的情况是,如果 breakreturn 在循环中,并且由于复杂的过程 >O(n) 您必须尽快退出breaked 很多次,这确实是一种罕见的情况,并且清楚地表明了糟糕的设计。正如您从其他答案中看到的那样,即使在这种情况下,它也不会对您的代码产生很大影响。

    现在,假设“最佳”是指一般的代码,所选择的选项都不好。一般来说,代码 sn-p 应该被翻译成

    def func():
        while not condition:
            do_smth....
    

    break/empty return 用于非常特定情况下,以提高可读性,我会说从不考虑效率。

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      相关资源
      最近更新 更多