Python模块的大小是否有限制?

时间:2019-04-20 19:01:32

标签: python bytecode interpreter

Python模块的大小是否受到限制?

在我看来,Python字节码指令POP_JUMP_IF_FALSE接受一个1字节的操作数,告诉它要跳转的指令索引。

引用ceval.c中的一些相关CPython代码(评论我的):

case TARGET(POP_JUMP_IF_FALSE): {
    PREDICTED(POP_JUMP_IF_FALSE);
    PyObject *cond = POP();
    int err;
    if (cond == Py_True) {
        Py_DECREF(cond);
        FAST_DISPATCH();
    }
    if (cond == Py_False) {
        Py_DECREF(cond);
        JUMPTO(oparg);  # <--- this
        FAST_DISPATCH();
    }

这是否意味着Python模块不能包含超过255个字节码指令?我在这里想念什么?

1 个答案:

答案 0 :(得分:2)

注意:我不是Python方面的专家,而且绝对不是解释字节码的人,这就是我在尝试了一段时间后发现的。

注意:我使用的是Python 3.7.3,如果您使用的是其他版本,则可能会得到不同的反汇编输出(贷方@dunes指出了这一点)。

# module.py
x = 0
while True:
  if x == 0:
    continue

将产生以下说明:(通过python3 -m dis module.py

  1           0 LOAD_CONST               0 (0)
              2 STORE_NAME               0 (x)

  2           4 SETUP_LOOP              14 (to 20)

  3     >>    6 LOAD_NAME                0 (x)
              8 LOAD_CONST               0 (0)
             10 COMPARE_OP               2 (==)
             12 POP_JUMP_IF_FALSE        6

  4          14 JUMP_ABSOLUTE            6
             16 JUMP_ABSOLUTE            6
             18 POP_BLOCK
        >>   20 LOAD_CONST               1 (None)
             22 RETURN_VALUE

在偏移量12处的是POP_JUMP_IF_FALSE指令。在文件顶部添加了一堆代码之后(我多次重复x = 0):

271        1080 SETUP_LOOP              20 (to 1102)

272     >> 1082 LOAD_NAME                0 (x)
           1084 LOAD_CONST               0 (0)
           1086 COMPARE_OP               2 (==)
           1088 EXTENDED_ARG             4
           1090 POP_JUMP_IF_FALSE     1082

273        1092 EXTENDED_ARG             4
           1094 JUMP_ABSOLUTE         1082
           1096 EXTENDED_ARG             4
           1098 JUMP_ABSOLUTE         1082
           1100 POP_BLOCK
        >> 1102 LOAD_CONST               1 (None)
           1104 RETURN_VALUE

编译器在偏移量1088处添加了EXTENDED_ARG指令,该指令允许更大的操作数。