{site_name}

{site_name}

🌜 搜索

Python bytecode 是 Python 在执行过程中的中间代码,它是一种与特定平台无关的二进制格式

Python 𝄐 0
python编程,python什么东西,python代码大全,python学了能干嘛,python在线咨询,python123
Python bytecode 是 Python 在执行过程中的中间代码,它是一种与特定平台无关的二进制格式。CPython 是 Python 的一个实现,用 C 语言编写,是最常用的实现之一。

PythonCPython bytecode changes 包括两个方面的改变:

1. Python 的语言特性和语法变化会影响生成的 bytecode;
2. CPython 实现本身的变化也可能导致生成的 bytecode 发生变化。

下面是一个简单的例子:

python
# Python 3.9.1
def add(a, b):
return a + b

print(add(1, 2))


上述代码经过编译后生成以下的 bytecode:


2 0 LOAD_FAST 0 (a)
2 LOAD_FAST 1 (b)
4 BINARY_ADD
6 RETURN_VALUE


这里使用了 LOAD_FAST 指令读取局部变量 a 和 b 的值,然后使用 BINARY_ADD 指令计算它们的和,最后使用 RETURN_VALUE 指令返回结果。

如果使用 Python 2.x 版本,则生成的 bytecode 将不同,例如:


2 0 LOAD_FAST 0 (a)
3 LOAD_FAST 1 (b)
6 BINARY_ADD
7 RETURN_VALUE


可以看到,Python 2.x 版本的 bytecode 中指令的编号比 Python 3.x 版本少了一倍(因为在 2.x 中,每个指令占两个字节)。以上是因为 Python 的语言特性的变化所导致的 bytecode 改变。

另一个例子,从 Python 3.7 开始,对于 f-string 的优化改善了对多行字符串的生成 bytecode 的支持。下面是一个使用 f-string 的例子:

python
# Python 3.9.1
name = "John"
age = 30
message = f"My name is {name} and I am {age} years old."
print(message)


编译后生成以下的 bytecode:


2 0 LOAD_CONST 0 ('John')
2 STORE_NAME 0 (name)

3 4 LOAD_CONST 1 (30)
6 STORE_NAME 1 (age)

4 8 LOAD_CONST 2 ('My name is ')
10 LOAD_NAME 0 (name)
12 FORMAT_VALUE 0
14 LOAD_CONST 3 (' and I am ')
16 BINARY_ADD
18 LOAD_NAME 1 (age)
20 FORMAT_VALUE 0
22 BINARY_ADD
24 LOAD_CONST 4 (' years old.')
26 BINARY_ADD
28 STORE_NAME 2 (message)

5 30 LOAD_NAME 3 (print)
32 LOAD_NAME 2 (message)
34 CALL_FUNCTION 1
36 POP_TOP
38 LOAD_CONST 5 (None)
40 RETURN_VALUE


可以看到,上述 bytecode 使用了 FORMAT_VALUE 指令来处理 f-string,但在 Python 3.6 及以前的版本中,生成的 bytecode 是使用了更为复杂的指令序列。

以上是因 CPython 实现的变化所导致的 bytecode 改变。