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

问题描述 投票:7回答:1

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个字节码指令?我在这里错过了什么?

python bytecode interpreter
1个回答
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指令,允许更大的操作数。

© www.soinside.com 2019 - 2024. All rights reserved.