elif与else if; 是一个比另一个快,看着python程序集

Rob*_*Rob 2 python conditional

这两个代码片段是完全相同的(就像它们在c ++中一样)还是会产生稍微不同的运行时间?

第一)

x = 'hello joe'

if x == 'hello':
  print('nope')
elif x == 'hello joe':
  print(x)
Run Code Online (Sandbox Code Playgroud)

第二)

x = 'hello jo'

if x == 'hello':
  print('nope')
else:
  if x == 'hello joe':
    print(x)
Run Code Online (Sandbox Code Playgroud)

我想找出自己,但我不确定如何实时观看这个代码以汇编形式运行.这让我想到了第二个问题:我如何看到编译Python程序时编译的汇编指令?

Jea*_*bre 7

首先,让我们将您的代码放在一个函数中

def func():               # line 1
    x = 'hello joe'       # line 2

    if x == 'hello':      # line 4
      print('nope')       # line 5
    else:                 # line 6
     if x == 'hello joe': # line 7
      print(x)            # line 8
Run Code Online (Sandbox Code Playgroud)

现在反汇编(使用CPython 3.4):

import dis
dis.dis(func)
Run Code Online (Sandbox Code Playgroud)

我们得到:

  2           0 LOAD_CONST               1 ('hello joe')
              3 STORE_FAST               0 (x)

  4           6 LOAD_FAST                0 (x)
              9 LOAD_CONST               2 ('hello')
             12 COMPARE_OP               2 (==)
             15 POP_JUMP_IF_FALSE       31

  5          18 LOAD_GLOBAL              0 (print)
             21 LOAD_CONST               3 ('nope')
             24 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             27 POP_TOP
             28 JUMP_FORWARD            25 (to 56)

  7     >>   31 LOAD_FAST                0 (x)
             34 LOAD_CONST               1 ('hello joe')
             37 COMPARE_OP               2 (==)
             40 POP_JUMP_IF_FALSE       56

  8          43 LOAD_GLOBAL              0 (print)
             46 LOAD_FAST                0 (x)
             49 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             52 POP_TOP
             53 JUMP_FORWARD             0 (to 56)
        >>   56 LOAD_CONST               0 (None)
             59 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

现在改为 elif:

  2           0 LOAD_CONST               1 ('hello joe')
              3 STORE_FAST               0 (x)

  4           6 LOAD_FAST                0 (x)
              9 LOAD_CONST               2 ('hello')
             12 COMPARE_OP               2 (==)
             15 POP_JUMP_IF_FALSE       31

  5          18 LOAD_GLOBAL              0 (print)
             21 LOAD_CONST               3 ('nope')
             24 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             27 POP_TOP
             28 JUMP_FORWARD            25 (to 56)

  6     >>   31 LOAD_FAST                0 (x)
             34 LOAD_CONST               1 ('hello joe')
             37 COMPARE_OP               2 (==)
             40 POP_JUMP_IF_FALSE       56

  7          43 LOAD_GLOBAL              0 (print)
             46 LOAD_FAST                0 (x)
             49 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             52 POP_TOP
             53 JUMP_FORWARD             0 (to 56)
        >>   56 LOAD_CONST               0 (None)
             59 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

唯一的区别是行号.

    else:                 # line 6
     if x == 'hello joe': # line 7
Run Code Online (Sandbox Code Playgroud)

成为(并转移其余部分)

    elif x == 'hello joe': # line 6
Run Code Online (Sandbox Code Playgroud)

两个版本中都有尽可能多的指令.在这种情况下,elseif关键字的转换方式似乎完全相同elif.并非所有实现都保证.就个人而言,我坚持使用最短的代码(elif),因为它更"有意义",如果代码应该更快,那么它可能就是那个.