Python if语句效率

2024-04-24 14:54:05 发布

您现在位置:Python中文网/ 问答频道 /正文

一个朋友(一个低技能水平的娱乐性python脚本编写者)让我查看一些代码。我注意到他有7个单独的陈述,基本上都是这样说的。

if ( a and b and c):
    do something

语句a、b、c都测试了它们是否相等或缺少设置值。当我查看它时,我发现由于测试的性质,我可以将整个逻辑块重新编写成两个分支,这两个分支的深度从来没有超过3次,而且很少超过第一级(首先进行最罕见的测试)。

if a:
    if b:
        if c:
    else:
        if c:
else:
    if b:
        if c:
    else:
        if c:

对我来说,从逻辑上看,如果你做的测试越少,越简单,失败越快,并且继续进行下去,那就应该越快。 我真正的问题是

1)当我说if和else时,if是否应该是真的,else是否会被完全忽略?

2)理论上

如果(a、b和c)

三个独立的if语句所需的时间是多少?


Tags: and代码脚本if技能分支水平朋友
3条回答

代码:

import dis

def foo():
  if ( a and b and c):
    pass
  else:
    pass

def bar():
  if a:
    if b:
      if c:
        pass

print 'foo():'
dis.dis(foo)
print 'bar():'
dis.dis(bar)

输出:

foo():
  4           0 LOAD_GLOBAL              0 (a)
              3 JUMP_IF_FALSE           18 (to 24)
              6 POP_TOP             
              7 LOAD_GLOBAL              1 (b)
             10 JUMP_IF_FALSE           11 (to 24)
             13 POP_TOP             
             14 LOAD_GLOBAL              2 (c)
             17 JUMP_IF_FALSE            4 (to 24)
             20 POP_TOP             

  5          21 JUMP_FORWARD             1 (to 25)
        >>   24 POP_TOP             

  7     >>   25 LOAD_CONST               0 (None)
             28 RETURN_VALUE        
bar():
 10           0 LOAD_GLOBAL              0 (a)
              3 JUMP_IF_FALSE           26 (to 32)
              6 POP_TOP             

 11           7 LOAD_GLOBAL              1 (b)
             10 JUMP_IF_FALSE           15 (to 28)
             13 POP_TOP             

 12          14 LOAD_GLOBAL              2 (c)
             17 JUMP_IF_FALSE            4 (to 24)
             20 POP_TOP             

 13          21 JUMP_ABSOLUTE           29
        >>   24 POP_TOP             
             25 JUMP_ABSOLUTE           33
        >>   28 POP_TOP             
        >>   29 JUMP_FORWARD             1 (to 33)
        >>   32 POP_TOP             
        >>   33 LOAD_CONST               0 (None)
             36 RETURN_VALUE        

因此,尽管设置相同,但组合表达式的清理速度更快,因为它在堆栈上只留下一个值。

如果if语句的计算结果为true,则它将跳过else括号中的所有内容。应该注意的是,担心这种问题,除非每一个程序执行数百万次,否则称为“过早优化”,应该避免。如果您的代码使用三个if (a and b and c)语句更清晰,那么它们应该留在中。

我认为单独的测试和单独的测试一样快。Python还使用了所谓的short-circuit evaluation

这意味着对于(a and b and c),如果afalse,那么bc将不再被测试。

类似地,如果你有一个OR表达式(a or b),并且atrue,则不会计算b

综上所述,分句的失败速度不快。

相关问题 更多 >