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中内置数据类型list,tuple,dict,set的区别和用法
Dec 14 Python
NLTK 3.2.4 环境搭建教程
Sep 19 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
Oct 29 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
Mar 01 Python
关于tensorflow的几种参数初始化方法小结
Jan 04 Python
python如何实现读取并显示图片(不需要图形界面)
Jul 08 Python
如何用python批量调整视频声音
Dec 22 Python
PyCharm 光标变成黑块的解决方式
Feb 06 Python
python 如何在 Matplotlib 中绘制垂直线
Apr 02 Python
Pytorch GPU内存占用很高,但是利用率很低如何解决
Jun 01 Python
Selenium浏览器自动化如何上传文件
Apr 06 Python
Python使用pandas导入csv文件内容的示例代码
Dec 24 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
全国FM电台频率大全 - 24 贵州省
2020/03/11 无线电
PHP制作图型计数器的例子
2006/10/09 PHP
php修改文件上传限制方法汇总
2015/04/07 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
PHP 裁剪图片
2021/03/09 PHP
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
2015/11/24 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
jQuery利用sort对DOM元素进行排序操作
2016/11/07 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
2018/10/20 Javascript
js数组去重的方法总结
2019/01/18 Javascript
JS实现可切换图片的幻灯切换效果示例
2019/05/24 Javascript
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
2019/08/16 Javascript
js 函数性能比较方法
2020/08/24 Javascript
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
Django中对数据查询结果进行排序的方法
2015/07/17 Python
使用Python实现Wake On Lan远程开机功能
2020/01/22 Python
python生成任意频率正弦波方式
2020/02/25 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
用python制作个音乐下载器
2021/01/30 Python
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
大学生个人总结的自我评价
2013/10/05 职场文书
社团文化节邀请函
2014/01/10 职场文书
护理人员的自我评价分享
2014/03/15 职场文书
群众路线教师自我剖析材料
2014/09/29 职场文书
2014年精神文明工作总结
2014/12/23 职场文书
助学金感谢信
2015/01/20 职场文书
活动总结模板大全
2015/05/11 职场文书
告知书格式
2015/07/01 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL