今天中软卓越广州Python培训课程和大家来讲讲Python程序运行原理。

一、模块的内建__name__属性,主模块其值为__main__,导入模块其值为模块名
1、创建时间,py文件比pyc文件新,则从新生成pyc。
2、magic num,做运行前版本测试,版本不同重新生成pyc。
3、PyCodeObject对象,源代码中的字符串,常量值,字节码指令,原始代码行号的对应关系。
二、LEGB规则
1、Local:本地
当前所在命名空间(如函数,模块),函数的参数也属于命名空间内的变量。
2、Ecolsing functio:外部嵌套函数的命名空间
外部嵌套函数的命名空间(闭包中常见)。
3、Global:全局
全局变量,函数定义所在模块的命名空间。
4、Builtins:内建模块命名空间
① Python 在启动的时候会自动为我们载入很多内建的函数、类, 比如dict,list,type,print,这些都位于__builtins__模块中,可以使用dir(__builtins__)来查看。
② 在Python中,有一个内建模块,该模块中有一些常用函数;在Python启动后,且没有执行程序员所写的任何代码前,Python会首先加载该内建函数到内存。另外,该内建模块中的功能可以直接使用,不用在其前添加内建模块前缀,其原因是对函数、变量、类等标识符的查找是按LEGB法则,其中B即代表内建模块。
三、dir函数
Python的内置函数dir可以用来查看一个命名空间下的所有名字符号。一个用处是查看一个命名空间的所有属性和方法(这里的命名空间就是指类、函数、module)。
四、垃圾回收
1、小整数对象池:
① 整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间。
② Python对小整数的定义是 [-5, 257) 这些整数对象是提前建立好的,不会被垃圾回收。在一个Python的程序中,所有位于这个范围内的整数使用的都是同一个对象。
2、大整数对象池:每一个大整数,均创建一个新的对象。
3、intern机制:python中有这样一个机制——intern机制,让他只占用一个“HelloWorld”所占的内存空间。靠引用计数去维护何时释放。
五、小结
1、小整数[-5,257)共用对象,常驻内存。
2、单个字符共用对象,常驻内存。
3、单个单词,不可修改,默认开启intern机制,共用对象,引用计数为0,则销毁。
4、字符串(含有空格),不可修改,没开启intern机制,不共用对象,引用计数为0,销毁 。
5、大整数不共用内存,引用计数为0,销毁 。
6、注:数值类型和字符串类型在Python中都是不可变的,这意味着你无法修改这个对象的值,每次对变量的修改,实际上是创建一个新的对象。
六、def指令
1、def func(),在字节码指令中就是MAKE_FUNCTION。Python是动态语言,def实际上是执行一条指令,用来创建函数(class则是创建类的指令),而不仅仅是个语法关键字。 函数并不是事先创建好的,而是执行到的时候才创建的。
2、def func()将会创建一个名称为func的函数对象。 实际上是先创建一个函数对象,然后将func这个名称符号绑定到这个函数上。
七、import导入包时进行搜索路径:
1、路径搜索:
import sys
sys.path:查看导入包路径
2、程序执行时导入模块路径
sys.path.append('/home/usr/local/images')
sys.path.insert(0,'/home/usr/local/image')
3、设置linux下导入模块路径
echo $pythonpath
export pythonpath=$pythonpath:'/home/usr/local/image'
4、如果程序已经引用了模块,但是模块被修改。需要重新导入模块:
可使用reload(module)进行,类似于情况缓存后进行import操作
八、pyc文件
1、概念:pyc文件是PyCodeObject对象在硬盘上的表现形式。生成pyc文:
2、pyc文件三大作用
① 创建时间,py文件比pyc文件新,则从新生成pyc文件
② magic num做运行前版本检测,版本不同从新生产pyc
③ PyCodeObject对象
④ 在运行期间,编译结果也就是PyCodeObject对象,只会存在于内存中,而当这个模块的Python代码执行完后,就会将编译结果保存到了pyc文件中,这样下次就不用编译,直接加载到内存中。
⑤ 这个PyCodeObject对象包含了Python源代码中的字符串,常量值,以及通过语法解析后编译生成的字节码指令。PyCodeObject对象还会存储这些字节码指令与原始代码行号的对应关系,这样当出现异常时,就能指明位于哪一行的代码。
九、import指令
1、import指令是用来载入module的,如果需要,也会顺道做编译的事。但import指令,还会做一件重要的事情就是把import的那个module的代码执行一遍,这件事情很重要。 Python是解释执行的,连函数都是执行的时候才创建的。如果不把那个module的代码执行一遍,那么module里面的函数都没法创建,更别提去调用这些函数了。
2、执行代码的另外一个重要作用,就是在这个module的命名空间中,创建模块内定义的函数和各种对象的符号名称(也就是变量名),并将其绑定到对象上,这样其他module才能通过变量名来引用这些对象。
3、Python虚拟机还会将已经import过的module缓存起来,放到一个全局module集合 sys.modules中。这样做有一个好处,即如果程序的在另一个地方再次import这个模块,Python 虚拟机只需要将全局 module 集合中缓存的那个module对象返回即可。
关于Python程序运行原理已经讲解完毕了。去企业,学习企业需要的编程技能!广州中软卓越Python培训,真实企业背景,送你企业入场券!
广州中软卓越课程:http://gzetc.com.cn/