Python随记 - 解释执行原理

Introduce: 技术分享|Python解释执行原理及过程(原作者:飞林沙)

Python解释器把源代码转换成中间形式:字节码。然后再由Python虚拟机来执行这些字节码。

我们就用不着担心程序的编译、库的连接加载等问题了,所有这些工作都由Python虚拟机代劳了。

一分为二地看待Python的解释语言特性

一方面,每次运行时都要进行转换成字节码,然后再由虚拟机把字节码转换成机器语言,最后才能在硬件上运行。

较之于编译性编程语言,每次运行都会多出两道工序,所以它的性能会受到影响。

另一方面,由于不用关心程序的编译以及库的连接等问题,所以开发工作会变得更轻松;

同时虚拟机距离物理机器更远了,所以Python程序更加易于移植,实际上无需改动就能在多种平台上运行。

Python是一门先编译后解释的语言

Python的也采用了类似Java的编译模式,先将Python程序编译成Python字节码(byte code),然后由一个专门的Python字节码解释器负责解释执行字节码。

Java虚拟机对字节码的执行相当于模拟一个cpu。Python也提供了和Java类似的VM来执行这样的byte code。

不同的是,因为Python是一个解释型的语言,所以编译(compile)不是一个强制的操作。

事实上,编译是一个自动的过程。多数情况下,你甚至不会在意他的存在。

编译成bytecode可以节省加载模块的时间,从而提高效率。

除了效率原因,byte code也增加了反向工程的难度,在某种程度上保护你的代码。当然,反编译仍然是可以的。

PyCodeObject和pyc文件

当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中。

当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。

当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件。如果找到,则直接载入,否则就重复上面的过程。

pyc文件其实是PyCodeObject的一种持久化保存方式。

pyc文件的目的是重用

我们之所以要把py文件编译成pyc文件,最大的优点在于我们在运行程序时,不需要重新对该模块进行重新的解释。

pyc文件的过期时间

当我的模块发生了改变的时候,是不是都要手动地把以前的pyc文件remove掉呢?

当然Python的设计者是不会犯这么白痴的错误的。答案取决于PyCodeObject是如何写入pyc文件中的。

看一下import过程的源码,其实每次在载入之前都会先检查一下py文件和pyc文件保存的最后修改日期,如果不一致则重新生成一份pyc文件。

 

posted @ 2023-04-26 00:31  AbendEssen29  阅读(17)  评论(0编辑  收藏  举报