运行 Python 代码时会发生什么?

发布: (2025年12月5日 GMT+8 22:33)
3 min read
原文: Dev.to

Source: Dev.to

一个简单的示例

让我们从一个简单的 Python 程序开始。假设我们在电脑上有一个名为 greet.py 的文件。文件中只有一个函数 greet()

# greet.py
def greet(name: str):
    print(f"Hello {name}!")

如果我们使用参数 "drani" 调用这个函数:

greet(name="drani")

程序会输出:

Hello drani!

运行 Python 程序

要运行该程序,通常使用以下命令:

python greet.py

当此命令执行时,后台会发生多件事。

1. 加载代码

Python 解释器(CPython)会将源文件从磁盘加载到内存中,为执行做好准备。

2. 编译为字节码

解释器调用内部编译器,执行以下几个步骤:

  • 标记化(Tokenization): 将源代码拆分为有意义的符号(称为 token)。
  • 构建抽象语法树(AST): 将 token 组织成一棵树结构,表示程序的逻辑。
  • 编译为字节码: 将 AST 转换为 Python 字节码,这是一种更底层的表示,解释器可以高效执行。

如果在 __pycache__ 目录下已经存在对应的 .pyc 缓存字节码文件,Python 可能会直接加载该文件,而不是重新编译源文件,从而加快经常使用的模块的执行速度。

3. 执行字节码

CPython 虚拟机逐条执行字节码指令。对于每个操作码(opcode):

  • 解释器将该操作码分派给实现该操作的相应 C 函数。
  • 这些 C 函数已编译为本机机器码,CPU 能够直接理解。
  • CPU 取指、解码并执行这些指令,在内存中操作 Python 对象。

该过程会一直进行,直到所有指令执行完毕。

4. 产生输出

当执行结束时,任何产生的值都会存储在内存中。如果程序包含 print() 等输出命令,结果就会显示在用户的屏幕上。

结论

即使是像 greet.py 这样简单的程序,也在幕后经历了多个处理层次:加载文件、编译为字节码以及执行机器级指令。Python 隐藏了大部分复杂性,使得编写和运行代码变得轻松,同时仍保持高效和强大。了解这一过程可以帮助你编写更高效的程序、排查性能问题,并在出现错误时更好地进行解释。

Back to Blog

相关文章

阅读更多 »