elif 与 else if;一个比另一个快并且正在查看 python 程序集
elif versus else if; is one faster than the other and looking at python assembly
这两个代码片段是否完全相同(就像它们在 c++ 中一样)还是它们都会产生略微不同的 运行ning 时间?
第一)
x = 'hello joe'
if x == 'hello':
print('nope')
elif x == 'hello joe':
print(x)
秒)
x = 'hello jo'
if x == 'hello':
print('nope')
else:
if x == 'hello joe':
print(x)
我想亲自了解一下,但不确定如何以汇编形式实时观看此代码 运行。这就引出了我的第二个问题:我如何查看编译 Python 程序时生成的编译汇编指令?
首先,让我们将您的代码放入函数中
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
现在用它反汇编(使用 CPython 3.4):
import dis
dis.dis(func)
我们得到:
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
现在改为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
唯一的区别是行号。
else: # line 6
if x == 'hello joe': # line 7
变成(并移动其余部分)
elif x == 'hello joe': # line 6
两个版本的说明一样多。在这种情况下,else
和 if
关键字的转换方式似乎与 elif
完全相同。不保证在所有实施中。就个人而言,我会坚持使用最短的代码 (elif
),因为它更 "meaningful",如果代码 应该 更快,它可能就是那个。
这两个代码片段是否完全相同(就像它们在 c++ 中一样)还是它们都会产生略微不同的 运行ning 时间?
第一)
x = 'hello joe'
if x == 'hello':
print('nope')
elif x == 'hello joe':
print(x)
秒)
x = 'hello jo'
if x == 'hello':
print('nope')
else:
if x == 'hello joe':
print(x)
我想亲自了解一下,但不确定如何以汇编形式实时观看此代码 运行。这就引出了我的第二个问题:我如何查看编译 Python 程序时生成的编译汇编指令?
首先,让我们将您的代码放入函数中
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
现在用它反汇编(使用 CPython 3.4):
import dis
dis.dis(func)
我们得到:
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
现在改为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
唯一的区别是行号。
else: # line 6
if x == 'hello joe': # line 7
变成(并移动其余部分)
elif x == 'hello joe': # line 6
两个版本的说明一样多。在这种情况下,else
和 if
关键字的转换方式似乎与 elif
完全相同。不保证在所有实施中。就个人而言,我会坚持使用最短的代码 (elif
),因为它更 "meaningful",如果代码 应该 更快,它可能就是那个。