【发布时间】:2016-10-20 21:43:43
【问题描述】:
我不确定这是否应该进入 cs 或程序员堆栈交换,所以如果应该请告诉我。我知道在其他语言中,continue 可能会出现问题,因为它本质上执行无条件分支,这会导致流水线机器上的性能问题,因为为了有效地流水线,我们需要能够知道接下来是什么指令,哪个无条件分支可以预防。这可以通过使用更可靠的逻辑来防止。话虽如此,我知道在 Python 中,continue 可以提高循环内的性能,但是,我希望不仅仅是轶事证据来支持这一点。谁能详细说明 为什么 在 Python 中会出现这种情况?此外,在 Python 中使用 continue 是否被认为是“正确的”逻辑(即 Pythonic)?谢谢!
更新
我也对性能影响感到好奇。如上所述,在其他语言中,continue 基本上是一个无条件分支。显然,这可能会导致流水线机器上的性能问题。所以我很好奇,在 Python 中使用 continue 时是否也存在固有的性能开销,即使在循环中使用时会有性能提升?
在示例代码中(尝试对插入排序进行返工,忽略整体逻辑,这源于一些尝试获得优于 O(n2) 性能的实验),如果我们有在我们可以确定下一个元素应该去哪里(在头部或尾部)的情况下,我们可以轻松地将它放在那里并使用 continue 语句忽略循环的其余部分
def insertion_sort(array):
sublist = [array[0]]
for i in range(1, len(array)):
if array[i] >= sublist[i-1]:
sublist.append(array[i])
continue #possible performance loss here
if array[i] <= sublist[0]:
sublist.insert(0, array[i])
continue #possible performance loss here
for j in reversed(range(0, i)):
if array[i] >= sublist[j-1] and array [i] <=sublist[j]:
sublist.insert(j, array[i])
break #possible performance loss here
return sublist
【问题讨论】:
-
看看Are `break` and `continue` bad programming practices?。使用
continue没有任何问题,它可以使某些代码更具可读性。 -
我想这确实回答了“正确”逻辑的问题。但我仍然对性能的影响感到好奇。更新问题,见上文!
-
取决于具体的用例。无论如何,当到达块的末尾时,流程将返回到循环的开头,因此如果您使用
continue来短路特定情况的逻辑,它最终仍会执行相同数量的迭代,除非你明确地break退出循环。从优化的 POV 来看,最常见的情况在循环代码中首先处理可能更重要。发布一些具体的例子会有所帮助。 -
添加示例代码