`
san_yun
  • 浏览: 2654616 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Python程序的执行原理

 
阅读更多

1. 过程概述

Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令,从而完成程序的执行。

2. 字节码

字节码在Python虚拟机程序里对应的是PyCodeObject对象。
.pyc文件是字节码在磁盘上的表现形式。

3. pyc文件

PyCodeObject对象的创建时机是模块加载的时候,即import。
Python test.py会对test.py进行编译成字节码并解释执行,但是不会生成test.pyc。
如果test.py加载了其他模块,如import util,Python会对util.py进行编译成字节码,生成util.pyc,然后对字节码解释执行。
如果想生成test.pyc,我们可以使用Python内置模块py_compile来编译。
加载模块时,如果同时存在.py和.pyc,Python会尝试使用.pyc,如果.pyc的编译时间早于.py的修改时间,则重新编译.py并更新.pyc。

4. PyCodeObject

Python代码的编译结果就是PyCodeObject对象。

 

 

 


5. pyc文件格式

加载模块时,模块对应的PyCodeObject对象被写入.pyc文件,格式如下:


6. 分析字节码

6.1 解析PyCodeObject

Python提供了内置函数compile可以编译Python代码和查看PyCodeObject对象,如下:

Python代码[test.py]

 

 

在Python交互式shell里编译代码得到PyCodeObject对象:

dir(co)已经列出co的各个域,想查看某个域直接在终端输出即可:

test.py的PyCodeObject

 

 

Python解释器会为函数也生成的字节码PyCodeObject对象,见上面的co_consts[1]

func的PyCodeObject

 

 

co_code是指令序列,是一串二进制流,它的格式和解析方法见6.2。

6.2 解析指令序列

指令序列co_code的格式

opcode oparg opcode opcode oparg …
1 byte 2 bytes 1 byte 1 byte 2 bytes  

Python内置的dis模块可以解析co_code,如下图:

test.py的指令序列

func函数的指令序列

第一列表示以下几个指令在py文件中的行号;
第二列是该指令在指令序列co_code里的偏移量;
第三列是指令opcode的名称,分为有操作数和无操作数两种,opcode在指令序列中是一个字节的整数;
第四列是操作数oparg,在指令序列中占两个字节,基本都是co_consts或者co_names的下标;
第五列带括号的是操作数说明。


7. 执行字节码

Python虚拟机的原理就是模拟可执行程序再X86机器上的运行,X86的运行时栈帧如下图:

假如test.py用C语言来实现,会是下面这个样子:

 

 

Python虚拟机的原理就是模拟上述行为。当发生函数调用时,创建新的栈帧,对应Python的实现就是PyFrameObject对象。

7.1 PyFrameObject

 

 

那么对应Python的运行时栈就是这样子:

7.2 执行指令

执行test.py的字节码时,会先创建一个栈帧,以下用f表示当前栈帧,执行过程注释如下:

test.py的符号名集合和常量集合

 

 

test.py的指令序列

上面的CALL_FUNCTION指令执行时,会创建新的栈帧,并执行func的字节码指令,以下用f表示当前栈帧,func的字节码执行过程如下:

func函数的符号名集合和常量集合

 

 

func函数的指令序列

7.3 查看栈帧

如果你想查看当前栈帧,Python提供了sys._getframe()方法可以获取当前栈帧,你只需要在代码里加入代码如下:

 

 

 

分享到:
评论

相关推荐

    Python程序执行原理-程序执行原理简介

    自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统管理任务的处理和Web编程,Python已经成为最受欢迎的程序设计语言之一。 Python教学简单易懂,零基础小白也可以学会,只要你有耐心学习从入门...

    Python程序执行原理明确程序的作用

    自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统管理任务的处理和Web编程,Python已经成为最受欢迎的程序设计语言之一。 Python教学简单易懂,零基础小白也可以学会,只要你有耐心学习从入门...

    Python程序执行原理-明确目标

    自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统管理任务的处理和Web编程,Python已经成为最受欢迎的程序设计语言之一。 Python教学简单易懂,零基础小白也可以学会,只要你有耐心学习从入门...

    Python程序执行原理-明确变量负责保存数据

    自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统管理任务的处理和Web编程,Python已经成为最受欢迎的程序设计语言之一。 Python教学简单易懂,零基础小白也可以学会,只要你有耐心学习从入门...

    Python程序执行原理-计算机中的三大件

    自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统管理任务的处理和Web编程,Python已经成为最受欢迎的程序设计语言之一。 Python教学简单易懂,零基础小白也可以学会,只要你有耐心学习从入门...

    Python程序执行原理-计算机三大件特点的问答

    自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统管理任务的处理和Web编程,Python已经成为最受欢迎的程序设计语言之一。 Python教学简单易懂,零基础小白也可以学会,只要你有耐心学习从入门...

    Python入门基础教程全套.ppt下载

    本教程将带领读者了解 Python 的发展历程、特点、应用领域,并指导读者掌握 PyCharm 编写简单 Python 程序、Python 开发环境的配置和 Python 程序执行原理等内容。 一、Python 发展历程 Python 的创始人是荷兰的 ...

    python基础知识(包括程序执行原理,算术运算符,变量的使用等)

    python基础知识(包括程序执行原理,算术运算符,变量的使用等) python基础知识(包括程序执行原理,算术运算符,变量的使用等) python基础知识(包括程序执行原理,算术运算符,变量的使用等) python基础知识...

    Python入门基础教程全套.ppt

    Python程序执行原理可以分为三个阶段:解释、编译和执行。在解释阶段,Python解释器将源代码解释为字节码;在编译阶段,字节码被编译为机器代码;在执行阶段,机器代码被执行。 Python语法变更 Python 2.x和Python...

    Python基础编程全教程+实践案例

    3.1 Python程序执行原理 3.2 Python程序文件执行 3.3 Python程序交互式执行 4、 Python语法知识 4.1 基本语法 4.2 变量与数据类型 4.3 标识符与关键字 4.4 语句概述 4.5 输入与输出函数 5、 Python基本数据...

    Python 程序执行时间分析器 Chronic.zip

    Python 程序执行时间分析器 Chronic 是一个用于度量和分析 Python 代码运行时间的工具。Chronic 提供了一种简洁的方式来跟踪和记录代码执行的耗时,这对于优化性能和理解程序瓶颈至关重要。它不同于基本的计时器,...

    (完整版)Python快速编程入门教程.ppt

    Python 程序执行原理 Python 程序的执行原理是通过解释器来执行的。Python 解释器将源代码转换为字节码,然后执行字节码。PyCharm 等 IDE 提供了调试功能,允许开发者逐步执行代码、检查变量值等。 Python 语法...

    Python编程基础教程完整版ppt整本书教学教程最全电子讲义(最新.ppt

    Python程序执行原理: * 解释器将源代码翻译成字节码 * 由虚拟机解释执行 Python程序的执行方式: * Python程序文件执行方式 * Python程序交互执行方式 编写一个简单的Python程序: * 使用IDLE程序打开新窗口 *...

    Python入门基础教程培训手册全套.ppt

    5. **Python程序执行原理**:Python程序执行时,解释器会逐行读取并执行代码。Python的执行过程包括词法分析、语法分析、编译成字节码,然后通过Python虚拟机(PVM)执行。Python 2.x和3.x之间存在一些语法差异,...

    Python教学大纲.doc

    * Python 程序执行原理 2. Python 语法基础:掌握 Python 中的变量和变量类型,标识符,关键字,运算符等基础知识。 知识点: * 变量 * 标识符和关键字 * 整型、浮点型、布尔类型、复数类型 * 数字类型转换 * ...

    好玩的python程序的实现(有注释,80多个)

    "好玩的python程序的实现(有注释,80多个)"这个压缩包文件就提供了这样一个丰富的资源库,适合Python初学者深入理解和实践。下面我们将详细探讨这些程序可能包含的知识点。 首先,基础语法是Python学习的核心部分...

    Python实现输出程序执行进度百分比的方法

    在开发大型Python程序时,向用户展示程序的执行进度不仅可以提升用户体验,还能避免用户误以为程序出现了死锁或无响应的情况。本篇文章将详细介绍如何在Python中实现输出程序执行进度百分比的功能,并提供具体的代码...

    Python 程序设计基础第二版 董付国PPT

    《Python程序设计基础第二版》是由董付国编著的一部深入浅出的Python学习教材,特别适合初学者。此套PPT涵盖了Python语言的基础到进阶内容,不仅讲解了Python的基本语法,还涉及到了一些高级主题,如数据库操作、...

    Python程序运行原理图文解析

    Python程序的运行原理是理解其工作方式的关键,它与编译型语言如C语言有着显著的区别。Python是一种解释型语言,这意味着它的代码不需要预先编译成机器可执行的二进制代码,而是由Python虚拟机(Python Virtual ...

Global site tag (gtag.js) - Google Analytics