java - python "elif"的编译方式是否与 else : if? 不同

标签 java python c++ if-statement micro-optimization

我知道在 C、C++、Java 和 C# 等语言中,( C# example )else if 语句是语法糖,因为它实际上只是一个 else 语句后跟 if 语句。

else if (conition(s)) { ...

等于

else {
    if (condition(s)) { ...
}

但是在python中,有一个特殊的elif语句。我一直想知道这是否只是开发人员的简写,或者是否有一些隐藏的优化 python 可以因此做,比如更快地解释?但这对我来说没有意义,因为那时其他语言也会这样做(例如 JavaScript)。所以,我的问题是,在 python 中,elif 语句只是供开发人员使用的简写形式,还是有一些隐藏的东西可以通过这样做获得?

最佳答案

当你真的想知道解释器的幕后发生了什么时,你可以使用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        

看起来我们的两个函数使用相同的字节码——所以显然它们是等价的。

不过要小心,字节码是 CPython 的一个实现细节——没有人说所有 python 实现在幕后做同样的事情——重要的是它们具有相同的行为。通过逻辑,您可以说服自己 f1f2 应该做同样的事情,无论底层实现是否将其视为“语法糖”或者是否存在某些东西更复杂的进行。

关于java - python "elif"的编译方式是否与 else : if? 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34304936/

相关文章:

python - Pandas 根据特定索引组合多个 Excel 工作表

c++ - Boost::Thread/C++11 std::thread,想要在条件下唤醒工作线程

c++ - 指向模板类实例的指针 vector

java - Drools - 检查列表中是否存在/包含字符串<String>

java - Spring JDBC 一对一关系

python - 如何使用 ffmpeg-python 创建动画图像 WebM 文件

python - 如何提高python导入速度?

c++ - 从文件中读取混合类型行

java.sql.SQLSyntaxErrorException : ORA-00936: missing expression

java - 如何与多线程服务器上的所有线程通信?