Python 最优循环函数出口

Python 最优循环函数出口,python,function,loops,Python,Function,Loops,假设有一个函数不返回任何内容,其中有一个循环。在某一点上,函数调用必须在循环中完成。需要明确的是,循环将始终迭代多次。有两种方法可以做到这一点: 1.带中断的结束循环: 二,。立即结束函数调用并返回: 就这些函数的实际功能而言,应该没有什么区别,但哪种方法更有效?使用timeit运行“count to 10”循环10 mln次。timeit显示直接返回运行速度稍快,因此可能应该这样做。这两种方法之间的差异是出于其目的而继承的 break语句用于循环内部,并在到达中断时停止迭代 return语句用

假设有一个函数不返回任何内容,其中有一个循环。在某一点上,函数调用必须在循环中完成。需要明确的是,循环将始终迭代多次。有两种方法可以做到这一点:

1.带中断的结束循环:

二,。立即结束函数调用并返回:


就这些函数的实际功能而言,应该没有什么区别,但哪种方法更有效?

使用timeit运行“count to 10”循环10 mln次。timeit显示直接返回运行速度稍快,因此可能应该这样做。

这两种方法之间的差异是出于其目的而继承的

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

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

时间上的差异是由到达断开/返回时启动的程序引起的;您可以看到,在指令级别,语句执行不同的操作->导致不同的计时:

import dis

def x():
    while True:
        return

def y():
    while True:
        break


print(dis.dis(x))
print(dis.dis(y))
输出为: 对于x:

对于y:


因此,很明显,如果您只是比较您给出的虚拟示例中的差异,返回速度会更快。

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

现在,假设optimal通常指的是代码,那么选择的两个选项都不好。一般来说,应该将代码段翻译为

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

出于可读性的考虑,在非常特定的情况下使用中断/空返回,出于效率的原因,我会说“从不”。

您的示例太有限,无法真正说明什么是总体上最好的。在您给定的示例中,最佳解决方案根本不是循环,因为它将在一次迭代后退出。如果您有一个真正的情况,这实际上会产生任何类型的显著差异,我将感到震惊…:记住,这是Python。保持简单,不要尝试和预先优化。虽然通常不建议使用true。通常不建议休息。若函数不返回任何内容,则不应返回任何内容。问题和代码太笼统了。你在那里写的东西可以而且应该被重构,而不是条件:do_smth。但这是基本的编程,与python或中断/返回的效率无关,顺便说一句,这不应该对代码产生影响。在任何情况下,func是否在另一个循环中?是的,那么“正确的方法”将不是它们中的任何一个。他们都错了。您可以在一些非常特殊的情况下看到这种变通方法,在大多数情况下,替代方法在可读性方面要差得多。您编写的两个示例都会导致难以辨认的代码,而且往往会导致bug。在任何情况下,性能方面的最佳选择都是不可能的,因为您在这里并不是在衡量“零的大O”。至于其他人,经验法则是:避免这种模式。还要检查@MikeMajara是否放得很好!够清楚了。但循环是否是虚拟的真的很重要吗?所有行都将以相同的方式以相同的时间执行,除了我们正在讨论的一行。猜测它只是更少的文本,然后@D.Moiseev它取决于您希望循环做什么;事情并不总是那么简单。但是为了这个简单而真实的原因,你把它贴出来是为了达到目的
import dis

def x():
    while True:
        return

def y():
    while True:
        break


print(dis.dis(x))
print(dis.dis(y))
4           0 SETUP_LOOP               4 (to 6)

  5           2 LOAD_CONST               0 (None)
              4 RETURN_VALUE
        >>    6 LOAD_CONST               0 (None)
              8 RETURN_VALUE
  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
def func():
    while not condition:
        do_smth....