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

Python 使用if-return或if-else-return更有效?,python,c,performance,compiler-construction,Python,C,Performance,Compiler Construction,假设我有一个if语句和一个return。从效率的角度来看,我应该使用 if(A > B): return A+1 return A-1 或 在使用编译语言(C)或脚本语言(Python)时,我应该选择其中一种还是另一种?对于任何合理的编译器,您应该注意没有区别;它们应该编译成相同的机器代码,因为它们是等价的。版本A更简单,这就是为什么我会使用它 如果您在Java中打开所有编译器警告,您将在第二个版本上收到警告,因为它是不必要的,并且会增加代码的复杂性。由于return语句终止当前

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

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


在使用编译语言(C)或脚本语言(Python)时,我应该选择其中一种还是另一种?

对于任何合理的编译器,您应该注意没有区别;它们应该编译成相同的机器代码,因为它们是等价的。

版本A更简单,这就是为什么我会使用它


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

由于
return
语句终止当前函数的执行,所以这两种形式是等效的(尽管第二种形式可能比第一种形式更可读)

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

请注意,Python支持一种语法,允许您在本例中仅使用一条
return
语句:

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

关于编码风格:

大多数编码标准(无论使用何种语言)都禁止将单个函数的多个返回语句作为错误的做法

(虽然我个人认为在某些情况下,多个返回语句是有意义的:文本/数据协议解析器、具有大量错误处理的函数等)

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

int result;

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

关于效率:

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

编辑:

资料来源:

  • MISRA-C:2004第14.7条规则,该规则依次引用…:
  • IEC 61508-3。第3部分,表B.9
  • IEC 61508-7。C.2.9
来自样式指南:

退货后不要使用其他物品:

# Bad
if (foo)
  return 1
else
  return 2

# Good
if (foo)
  return 1
return 2

return 1 if foo else 2

这是一个风格(或偏好)的问题,因为口译员并不在意。就我个人而言,我会尽量不让函数的最终语句返回函数基以外的缩进级别的值。示例1中的else使函数结束处变得模糊(如果只是稍微模糊的话)

根据偏好,我使用:

return A+1 if (A > B) else A-1
因为它既遵循一个良好的约定,即将一个返回语句作为函数中的最后一个语句(如前所述),也遵循避免命令式中间结果的良好函数编程范式

对于更复杂的函数,我更喜欢将函数分解为多个子函数,以避免过早返回(如果可能)。否则,我将恢复使用名为rval的命令式变量。我尽量不使用多个return语句,除非函数很琐碎,或者结尾之前的return语句是错误的结果。过早返回突出了一个事实,即你无法继续。对于设计成分支成多个子函数的复杂函数,我尝试将它们编码为case语句(例如由dict驱动)


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

我知道这个问题被标记为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

这就很好地解决了没有多次返回的风格问题。

我个人尽可能避免使用
else
块。见

而且,他们不收取额外费用,你知道:p

&“可读性为王”


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


这实际上取决于风格和可读性。您的第二个选项(if-else块)比第一个选项可读性更强,并且比单行三值运算可读性更强。

C也支持这一点<代码>返回(A>B)?A+1:A-1@glglgl:No,因为人们期望?:运算符的行为与else类似,这是不正确的。如果有人编写像
-1<1u
这样的代码(我对此表示怀疑),他们很容易发现错误。然而,相当多的人会为我发布的代码编写一些版本。我在生产代码中经常看到这样的错误,以至于不能相信?:操作符。还有一条经验法则,如果该语言提供两种不同的方法来做同一件事,请只使用其中一种,不要根据您的情绪随意选择这两种方法中的任何一种。@Lundin这是谨慎使用的理由?:在C中,但您似乎说它也适用于Python。你能指出在Python中使用三元组会导致意外结果的任何例子吗?你确定单返回宗教已经感染了大多数编码标准吗?那太可怕了。我想说这条规则在大多数情况下是没有意义的。我倾向于发现代码更具可读性,并且在适当的时候更容易遵循返回。但那只是我。然而,我想到的是每个公司/项目的编码标准,而不是像MISRA这样的东西,否则愚蠢的处方可能偶尔会有一些优点。“我希望大多数人不会接受单一出口点的想法。”丹尼尔·费舍:在C公司
def foo 
  if (A>B)
    A+1
  else 
    A-1
  end
end
delta = 1 if (A > B) else -1
return A + delta