使用if-return-return或if-else-return更有效?

Jor*_*tao 115 c python compiler-construction performance

假设我有一个if声明return.从效率的角度来看,我应该使用

if(A > B):
    return A+1
return A-1
Run Code Online (Sandbox Code Playgroud)

要么

if(A > B):
    return A+1
else:
    return A-1
Run Code Online (Sandbox Code Playgroud)

在使用编译语言(C)或脚本语言(Python)时,我应该更喜欢一个还是另一个?

Fré*_*idi 165

由于return语句终止了当前函数的执行,因此这两种形式是等效的(尽管第二种形式可以说比第一种形式更具可读性).

两种形式的效率相当,如果if条件为假,则底层机器代码必须执行跳转.

请注意,Python支持的语法允许您return在您的情况下只使用一个语句:

return A+1 if A > B else A-1
Run Code Online (Sandbox Code Playgroud)

  • @Lundin混淆了吗?不可读?仅适用于那些不了解三元运算符的人. (43认同)
  • C也支持这一点.`return(A> B)?A + 1:A-1;`然而,通过编写这样的代码,在性能上绝对没有任何好处.我们所获得的只是使代码模糊,不可读,在某些情况下更容易受到隐式类型促销的影响. (29认同)
  • @Lundin在这个论证之后,`<`是不好的做法,因为`-1 <1u`会产生意想不到的结果. (6认同)
  • @Lundin是一个小心的参数?:在C中,但你似乎也说它也适用于Python.你能指出在Python中使用三元导致意外结果的任何例子吗? (5认同)
  • @glglgl:不,因为人们希望?:运算符表现得像if-else,这不是真的.如果有人会编写像"-1 <1u"这样的代码,我怀疑它们会很容易发现错误.相当多的人会写一些我发布的代码版本.我在生产代码中经常看到这样的错误来信任?:运算符.另外,根据经验,如果语言为您提供了两种不同的方法来做同样的事情,只使用其中一种,不要根据您的心情随机选择其中任何一种. (3认同)

ske*_*r88 29

来自Chromium的风格指南:

退货后请勿使用其他:

# Bad
if (foo)
  return 1
else
  return 2

# Good
if (foo)
  return 1
return 2

return 1 if foo else 2
Run Code Online (Sandbox Code Playgroud)

  • 我很惊讶,因为第一个似乎更清晰,因此更好. (10认同)
  • 我不买。阅读“其他”一词比在头脑中弄清楚正在发生的事情更能提高大脑效率。即使很明显。一个词:“其他”总是更明显。心理学101 (8认同)
  • 你可以为两者做出合理的理由.这个决定中最重要的是IMO要在代码库中保持一致. (3认同)
  • 谢谢。+1。请问回来后为什么不用else? (2认同)
  • 在大多数情况下你可能会发现`if-else-return`分支几乎永远不会相等(如果它们是,那么你应该重构;无论是使用`switch`结构还是Python,枚举一个dict /使用callable/etc.).因此,几乎所有`if-else-return`都是保护条款的情况,并且那些在没有'else`的情况下总是可测试的(模拟测试表达式). (2认同)

per*_*bus 6

我个人else尽可能避免阻塞。参见Anti-if 活动

此外,他们不收取“额外”的费用,你知道:p

“简单胜于复杂” &“可读性为王”

delta = 1 if (A > B) else -1
return A + delta
Run Code Online (Sandbox Code Playgroud)

  • 我赞成你的答案,因为对我来说它在可读性和简单性方面得分。我个人认为这是令人反感的,有人在没有告诉我为什么我的回答积极否定的情况下对我投了反对票。 (3认同)
  • 为什么投反对票?是一个“pythonic”的答案。您可能不认为它是首选答案。但不是无效的。我也遵循 KISS 原则 https://en.wikipedia.org/wiki/KISS_principle (2认同)

Oli*_*rth 5

对于任何明智的编译器,您应该观察不到任何差异;它们应该被编译为相同的机器代码,因为它们是等效的。


Lun*_*din 5

关于编码风格:

无论哪种语言,大多数编码标准都禁止将单个函数中的多个return语句禁止作为不好的做法。

(尽管我个人会说在某些情况下多个返回语句确实有意义:文本/数据协议解析器,具有大量错误处理的功能等)

所有这些行业编码标准的共识是,该表达式应写为:

int result;

if(A > B)
{
  result = A+1;
}
else
{
  result = A-1;
}
return result;
Run Code Online (Sandbox Code Playgroud)

关于效率:

上面的示例和问题中的两个示例在效率方面都完全等效。在所有这些情况下,机器码都必须比较A> B,然后跳转到A + 1或A-1计算,然后将结果存储在CPU寄存器或堆栈中。

编辑:

资料来源:

  • MISRA-C:2004规则14.7,依次引用...:
  • IEC 61508-3。第3部分,表B.9。
  • IEC 61508-7。C.2.9。

  • 您确定单回教徒感染了大多数编码标准吗?那将是可怕的。 (34认同)
  • 我会说规则在大多数情况下都没有意义。我倾向于发现代码更易读,更容易在适当的时候返回。但这就是我。但是,我想到的是针对每个公司/项目的编码标准,而不是像MISRA这样的东西,否则,愚蠢的处方有时可能会有一些优点。我希望大多数人不接受单一出口点的想法。 (6认同)
  • 请参阅[此SO问题](http://stackoverflow.com/questions/4838828/why-should-a-function-have-only-one-exit-point)进行讨论,并获得有关单个主题的进一步讨论的更多链接。出口问题。除了过时且过分“工程化”的单出口规则外,Python *专门*促进了[“扁平比嵌套更好”视图](http://www.python.org/dev/peps/pep -0020 /),然后将`return` **放置在任何地方,这显然是用Python的惯用方法。 (6认同)
  • @DanielFischer:在我为公司设计的基于MISRA的C编码标准中,我有一条规则:“一个函数只能有一个出口,在函数的末尾,除非有一个出口使代码成为可能。可读性差”。因此,它是MISRA-C,但有一个例外。如果您编写了一个高级解析器函数,该函数可以返回10个不同的错误,则嵌套花括号的级别使代码完全不可读-在这种情况下,遇到错误立即返回更明智。 (3认同)