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

时间:2012-02-08 10:20:53

标签: python c performance compiler-construction

假设我的if语句带有return。从效率的角度来看,我应该使用

if(A > B):
    return A+1
return A-1

if(A > B):
    return A+1
else:
    return A-1

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

10 个答案:

答案 0 :(得分:142)

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

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

请注意,Python支持的语法允许您在您的案例中只使用一个return语句:

return A+1 if A > B else A-1

答案 1 :(得分:27)

来自Chromium's样式指南:

返回后请勿使用其他:

# Bad
if (foo)
  return 1
else
  return 2

# Good
if (foo)
  return 1
return 2

return 1 if foo else 2

答案 2 :(得分:5)

关于编码风格:

大多数编码标准无论语言禁止多个单一函数的返回语句都是不好的做法。

(虽然我个人会说有几种情况下多个return语句都有意义:文本/数据协议解析器,具有大量错误处理的函数等)

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

int result;

if(A > B)
{
  result = A+1;
}
else
{
  result = A-1;
}
return result;

关于效率:

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

编辑:

来源:

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

答案 3 :(得分:3)

使用任何合理的编译器,你应该观察没有区别;它们应编译成相同的机器代码,因为它们是等效的。

答案 4 :(得分:1)

版本A更简单,这就是我使用它的原因。

如果您打开Java中的所有编译器警告,您将收到第二个版本的警告,因为它是不必要的并且会增加代码复杂性。

答案 5 :(得分:1)

我个人尽量避免使用else障碍。参见Anti-if Campaign

此外,他们不会为该行收取“额外”费用,您知道:p

"Simple is better than complex"和“可读性为王”

delta = 1 if (A > B) else -1
return A + delta

答案 6 :(得分:0)

我知道问题是标记为python,但是它提到了动态语言,所以我认为我应该提到在ruby中if语句实际上有一个返回类型,所以你可以做类似的事情

def foo
  rv = if (A > B)
         A+1
       else
         A-1
       end
  return rv 
end

或者因为它也有隐含的回报

def foo 
  if (A>B)
    A+1
  else 
    A-1
  end
end

解决了没有多次回报的风格问题。

答案 7 :(得分:0)

这样想:

if (a > b):
    output = a + 1

output = a - 1

return output

相对于此:

if (a > b):
    output = a + 1
else:
    output = a - 1

return output

第一个示例不起作用,而第二个示例工作正常。它们具有相同的性能,所以我建议您使用示例2,因为我认为它更易于阅读。

答案 8 :(得分:-1)

这是风格(或偏好)的问题,因为翻译不在乎。就个人而言,我会尽量不做一个函数的最终语句,该函数在函数库以外的缩进级别返回一个值。示例1中的else模糊了(如果只是轻微的话)函数结尾的位置。

我喜欢使用:

return A+1 if (A > B) else A-1

因为它遵循将单个return语句作为函数中的最后一个语句(如上所述)和避免命令式样式中间结果的良好函数式编程范例的良好惯例。

对于更复杂的函数,我更喜欢将函数分解为多个子函数,以避免在可能的情况下过早返回。否则我将恢复使用名为rval的命令式样式变量。我尽量不使用多个return语句,除非函数是微不足道的,或者结尾之前的return语句是由于错误。过早地回归会突显出你无法继续下去的事实。对于旨在分支到多个子函数的复杂函数,我尝试将它们编码为case语句(例如由dict驱动)。

有些海报提到了操作速度。运行速度对我来说是次要的,因为如果你需要执行速度,Python不是最好用的语言。我使用Python作为编码的效率(即编写无错代码)对我来说很重要。

答案 9 :(得分:-1)

从性能的角度来看,这在 Python 中并不重要,而且我假设所有现代语言都是如此。

这真的归结为风格和可读性。您的第二个选项(if-else 块)比第一个更具可读性,并且比单行三元运算更具可读性。