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程序时编译的汇编指令?
首先,让我们将您的代码放在一个函数中
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)
两个版本中都有尽可能多的指令.在这种情况下,else和if关键字的转换方式似乎完全相同elif.并非所有实现都保证.就个人而言,我坚持使用最短的代码(elif),因为它更"有意义",如果代码应该更快,那么它可能就是那个.
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |