读 Python behind the scenes #3: stepping through the CPython source code

读 Python behind the scenes #3: stepping through the CPython source code

💡 原文中文,约7900字,阅读约需19分钟。
📝

内容提要

本文介绍了CPython源代码的执行过程,包括预初始化、核心初始化和完整初始化三个阶段。通过分析main函数和相关数据结构,阐述了Python程序的运行机制,涉及.py和.pyc文件的处理及字节码的执行过程。

🎯

关键要点

  • CPython的初始化分为三个阶段:预初始化、核心初始化和完整初始化。

  • 在预初始化阶段,初始化运行时状态和进程级状态,设置locale和内存分配器。

  • 核心初始化阶段创建主解释器状态和线程状态,初始化全局解释器锁和垃圾回收。

  • 完整初始化阶段完成sys.path和导入系统的设置,创建__main__。

  • Python程序的运行过程包括编译和解释,首先检查.pyc文件是否存在,若存在则直接执行。

  • 如果是.py文件,则通过解析生成抽象语法树(AST),再编译为代码对象并执行。

  • 执行过程中,使用评估循环逐条执行字节码,同时更新帧状态。

🔎

延伸解读

CPython初始化的多阶段流程

CPython的初始化过程分为预初始化、核心初始化和完整初始化三个阶段。这种分阶段的设计使得用户可以在预初始化后自定义内存分配器等设置,增强了灵活性和可扩展性。理解这一流程有助于开发者在调试和优化Python应用时,针对不同阶段进行调整。

字节码执行的关键环节

在Python程序运行过程中,字节码的执行是核心环节。通过评估循环逐条执行字节码,Python能够高效地管理内存和状态更新。开发者在编写代码时,了解字节码的执行机制可以帮助优化性能,尤其是在处理大量数据时。

文件处理的优先级

在执行Python脚本时,CPython首先检查是否存在对应的.pyc文件。如果存在且与当前版本兼容,系统将直接执行该字节码文件,跳过编译过程。这一机制显著提高了程序启动速度,开发者在部署时应考虑.pyc文件的管理,以确保运行效率。

延伸问答

CPython的初始化过程分为哪几个阶段?

CPython的初始化过程分为预初始化、核心初始化和完整初始化三个阶段。

Python程序是如何处理.py和.pyc文件的?

Python程序首先检查.pyc文件是否存在,若存在则直接执行;如果是.py文件,则解析生成抽象语法树(AST),再编译为代码对象并执行。

在CPython的核心初始化阶段,主要完成了哪些任务?

核心初始化阶段创建主解释器状态和线程状态,初始化全局解释器锁和垃圾回收。

Python程序的执行过程中,评估循环的作用是什么?

评估循环逐条执行字节码,同时更新帧状态,负责执行当前帧的代码。

CPython的预初始化阶段主要做了哪些工作?

预初始化阶段初始化运行时状态和进程级状态,设置locale和内存分配器。

Python的内置类型在初始化时有什么特别之处?

内置类型例如int初始化时,会将部分小整数放入small_ints缓存中,供未来复用。

🏷️

标签

➡️

继续阅读