har*_*ski 6 c++ python java if-statement micro-optimization
我知道在C,C++,Java和C#等语言中,(C#示例)else if语句是语法糖,因为它实际上只是一个else语句后跟一个if语句.
else if (conition(s)) { ...
Run Code Online (Sandbox Code Playgroud)
等于
else {
if (condition(s)) { ...
}
Run Code Online (Sandbox Code Playgroud)
但是,在python中,有一个特殊的elif声明.我一直想知道这是否只是开发人员的简写,或者是否有一些隐藏的优化python可以做到这一点,比如更快解释?但这对我来说没有意义,因为其他语言也会这样做(比如JavaScript).所以,我的问题是,在python中,elif语句只是开发人员使用的简写,还是隐藏了它通过这样做而获得的东西?
mgi*_*son 11
如果您真的想知道解释器幕后发生的事情,可以使用该dis模块.在这种情况下:
>>> def f1():
... if a:
... b = 1
... elif aa:
... b = 2
...
>>> def f2():
... if a:
... b = 1
... else:
... if aa:
... b = 2
...
>>> dis.dis(f1)
2 0 LOAD_GLOBAL 0 (a)
3 POP_JUMP_IF_FALSE 15
3 6 LOAD_CONST 1 (1)
9 STORE_FAST 0 (b)
12 JUMP_FORWARD 15 (to 30)
4 >> 15 LOAD_GLOBAL 1 (aa)
18 POP_JUMP_IF_FALSE 30
5 21 LOAD_CONST 2 (2)
24 STORE_FAST 0 (b)
27 JUMP_FORWARD 0 (to 30)
>> 30 LOAD_CONST 0 (None)
33 RETURN_VALUE
>>> dis.dis(f2)
2 0 LOAD_GLOBAL 0 (a)
3 POP_JUMP_IF_FALSE 15
3 6 LOAD_CONST 1 (1)
9 STORE_FAST 0 (b)
12 JUMP_FORWARD 15 (to 30)
5 >> 15 LOAD_GLOBAL 1 (aa)
18 POP_JUMP_IF_FALSE 30
6 21 LOAD_CONST 2 (2)
24 STORE_FAST 0 (b)
27 JUMP_FORWARD 0 (to 30)
>> 30 LOAD_CONST 0 (None)
33 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
看起来我们的两个函数使用相同的字节码 - 显然它们是等价的.
但是要小心,字节码是CPython的一个实现细节 - 没有人知道所有的 python实现都在幕后做同样的事情 - 重要的是它们具有相同的行为.通过逻辑,您可以说服自己,f1并且f2应该做同样的事情,无论底层实现是否将其视为"合成糖"或者是否存在更复杂的事情.
| 归档时间: |
|
| 查看次数: |
361 次 |
| 最近记录: |