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个字节码指令?我在这里想念什么?
答案 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
指令,该指令允许更大的操作数。