Python程序运行原理图文解析


Posted in Python onFebruary 10, 2018

本文研究的主要是Python程序运行原理,具体介绍如下。

编译型语言(C语言为例)

Python程序运行原理图文解析

动态型语言

Python程序运行原理图文解析

一个程序是如何运行起来的?比如下面的代码

#othermodule.py
def add(a, b):
  return a + b

#mainrun.py

import othermodule

a = ['xiaoke', 1, 'python']
a = 'xiaoke string'

def func():
  a = -5
  b = 257 
  print(a + b)

print(a)

if __name__ == '__main__':
  func()
  res = othermodule.add(1, 2)
  print(res)

分析

Python程序运行原理图文解析

Python程序运行原理图文解析

dir 函数

Python 的内置函数 dir 可以用来查看一个命名空间下的所有名字符号。一个用处是查看一个命名空间的所有属性和方法(这里的命名空间就是指类、函数、module)。

比如,查看当前的命名空间,可以使用 dir(),查看 sys 模块,可以使用 dir(sys)

def 指令

def func(),在字节码指令中就是 MAKE_FUNCTION。
Python 是动态语言,def 实际上是执行一条指令,用来创建函数
(class 则是创建类的指令),而不仅仅是个语法关键字。
函数并不是事先创建好的,而是执行到的时候才创建的。

def func() 将会创建一个名称为 func 的函数对象。
实际上是先创建一个函数对象,然后将 func 这个名称符号绑定到这个函数上。

pyc文件

pyc 文件是 PyCodeObject 对象在硬盘上的表现形式。生成pyc文件:

python -m py_compile xx_module.py

pyc文件三大作用

  1. 创建时间,py文件比pyc文件新,则从新生成pyc
  2. magic num做运行前版本检测,版本不同从新生成pyc
  3. PyCodeObject 对象

在运行期间,编译结果也就是 PyCodeObject 对象,只会存在于内存中,而当这个模块的 Python 代码执行完后,就会将编译结果保存到了 pyc 文件中,这样下次就不用编译,直接加载到内存中。

这个 PyCodeObject 对象包含了 Python 源代码中的字符串,常量值,以及通过语法解析后编译生成的字节码指令。PyCodeObject 对象还会存储这些字节码指令与原始代码行号的对应关系,这样当出现异常时,就能指明位于哪一行的代码。

import 指令

import 指令是用来载入 module 的,如果需要,也会顺道做编译的事。但 import 指令,还会做一件重要的事情就是把 import 的那个 module 的代码执行一遍,这件事情很重要。
Python 是解释执行的,连函数都是执行的时候才创建的。如果不把那个 module 的代码执行一遍,那么 module 里面的函数都没法创建,更别提去调用这些函数了。

执行代码的另外一个重要作用,就是在这个 module 的命名空间中,创建模块内定义的函数和各种对象的符号名称(也就是变量名),并将其绑定到对象上,这样其他 module 才能通过变量名来引用这些对象。

Python 虚拟机还会将已经 import 过的 module 缓存起来,放到一个全局 module 集合 sys.modules 中。
这样做有一个好处,即如果程序的在另一个地方再次 import 这个模块,Python 虚拟机只需要将全局 module 集合中缓存的那个 module 对象返回即可。

总结

以上就是本文关于Python程序运行原理图文解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python正常时间和unix时间戳相互转换的方法
Apr 23 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
Python实现自动上京东抢手机
Feb 06 Python
Django model序列化为json的方法示例
Oct 16 Python
详解Python locals()的陷阱
Mar 26 Python
Django框架 信号调度原理解析
Sep 04 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
Jan 08 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
Mar 05 Python
Python面向对象程序设计之继承、多态原理与用法详解
Mar 23 Python
python利用Excel读取和存储测试数据完成接口自动化教程
Apr 30 Python
python实现每天自动签到领积分的示例代码
Aug 18 Python
python 爬取B站原视频的实例代码
Sep 09 Python
Python迭代器和生成器定义与用法示例
Feb 10 #Python
Python中装饰器学习总结
Feb 10 #Python
Python基于hashlib模块的文件MD5一致性加密验证示例
Feb 10 #Python
Python中生成器和迭代器的区别详解
Feb 10 #Python
详解python中的线程
Feb 10 #Python
Odoo中如何生成唯一不重复的序列号详解
Feb 10 #Python
python TCP Socket的粘包和分包的处理详解
Feb 09 #Python
You might like
PHP安全配置
2006/12/06 PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
2012/09/05 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
javascript 时间比较实现代码
2009/10/28 Javascript
js判断运行jsp页面的浏览器类型以及版本示例
2013/10/30 Javascript
JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享
2014/04/11 Javascript
js 中将多个逗号替换为一个逗号的代码
2014/06/07 Javascript
jQuery实现两款有动画功能的导航菜单代码
2015/09/16 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
jQuery+css实现的切换图片功能代码
2016/01/27 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
React Native验证码倒计时工具类分享
2017/10/24 Javascript
webpack构建换肤功能的思路详解
2017/11/27 Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
2019/03/01 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
ES11新增的这9个新特性,你都掌握了吗
2020/10/15 Javascript
Python使用matplotlib简单绘图示例
2018/02/01 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
2019/05/10 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
Python小白垃圾回收机制入门
2020/06/09 Python
Original Penguin英国官方网站:美国著名休闲时装品牌
2016/10/30 全球购物
德国高品质男装及配饰商城:Cultizm(Raw Denim原色牛仔裤)
2018/04/16 全球购物
匡威俄罗斯官网:Converse俄罗斯
2020/05/09 全球购物
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
模具设计与制造专业应届生求职信
2013/10/18 职场文书
工厂门卫岗位职责
2013/11/25 职场文书
本科毕业生求职自荐信
2014/04/09 职场文书
2014年教师党员自我评议
2014/09/19 职场文书
群众路线自我剖析范文
2014/11/04 职场文书
共青团员自我评价
2015/03/10 职场文书
525心理健康活动总结
2015/05/08 职场文书
严以律己专题学习研讨会发言材料
2015/11/09 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
教你使用pyinstaller打包Python教程
2021/05/27 Python