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实现协同过滤的教程
Apr 08 Python
Python减少循环层次和缩进的技巧分析
Mar 15 Python
Python编写电话薄实现增删改查功能
May 07 Python
浅谈Python类的__getitem__和__setitem__特殊方法
Dec 25 Python
Python设计模式之工厂方法模式实例详解
Jan 18 Python
一文秒懂python读写csv xml json文件各种骚操作
Jul 04 Python
Python编程实现tail-n查看日志文件的方法
Jul 08 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
Sep 29 Python
Python读取分割压缩TXT文本文件实例
Feb 14 Python
Python函数__new__及__init__作用及区别解析
Aug 31 Python
Python中常用的os操作汇总
Nov 05 Python
Pycharm 设置默认解释器路径和编码格式的操作
Feb 05 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
Breeze 文章管理系统 v1.0.0正式发布
2006/12/14 PHP
PHP JSON格式的中文显示问题解决方法
2015/04/09 PHP
PHP提高编程效率的20个要点
2015/09/23 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
jQuery之选项卡的简单实现
2014/02/28 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
2015/05/09 Javascript
JS实现的竖向折叠菜单代码
2015/10/21 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
2017/03/07 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
详解vue + vuex + directives实现权限按钮的思路
2017/10/24 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
jQuery实现简易QQ聊天框
2020/02/10 jQuery
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
JS模拟实现京东快递单号查询
2020/11/30 Javascript
JS canvas实现画板和签字板功能
2021/02/23 Javascript
Python批量修改文本文件内容的方法
2016/04/29 Python
Python利用IPython提高开发效率
2016/08/10 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
keras获得model中某一层的某一个Tensor的输出维度教程
2020/01/24 Python
深入理解Python变量的数据类型和存储
2021/02/01 Python
CSS3实例分享--超炫checkbox复选框和radio单选框
2014/09/01 HTML / CSS
研究生考核个人自我鉴定
2014/03/27 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
国庆节慰问信
2015/02/15 职场文书
上课迟到检讨书范文
2015/05/06 职场文书
致运动员加油稿
2015/07/21 职场文书
校运会广播稿
2015/08/19 职场文书
2016教师暑期培训学习心得体会
2016/01/09 职场文书
2016大学军训心得体会
2016/01/11 职场文书
2016年“12.4”法制宣传日活动总结
2016/04/01 职场文书