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文件。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器