您现在所在位置: 首页 > 睿道新闻

python字节拓展码是怎样的一种东西?

发布时间:2020-09-15点击数:


  有没有一个方面想扩大自己的知识储备,却不知道从何下手?如果你想更多的了解python,不用担心,用python扩展你的知识。先学python字节码是个不错的选择。


  想从零开始学python,来东软瑞道python培训班吧,每年十万人选择的比较靠谱的培训机构。好了,让我们言归正传:


  Python字节码是什么?


  如果你曾经写过或者刚刚用过Python语言,那么你可能已经习惯了阅读Python源文件;源代码的文件名以.py结尾。也许你已经注意到另一种类型的文件,文件名以。pyc,也许你听说过它们是Python的“字节码”文件。(然而,它们在Python3上很难找到——因为它们不再与在同一个目录中。py文件,但在名为__pycache__的子目录中)。也许你听说过这是一个程序加速机制。通过防止Python在每次运行时重新解析源代码来加速程序。


  但是除了“哦,这是Python字节码”之外,你真的知道这些文件的内容以及Python是怎么使用的吗?


  如果答案是否定的,那么今天就是你的幸运日!我将向您展示Python字节码的含义,Python如何使用它来执行代码,以及它可以为我们做些什么。


  如何在python中使用Python字节码?


  Python通常被称为解释语言——一种当程序运行时,源代码立即被翻译成本机CPU指令的语言——但这只是部分正确。和其他很多解释语言一样,Python实际上是把源代码编译成一组虚拟机指令,Python的解释器是虚拟机的具体实现。虚拟机内部运行的这种中间格式称为“字节码”。


  因此。Python留下的pyc文件不仅是源代码的“更快”或“优化”版本;事实上,它们是程序运行时由Python的虚拟机执行的字节码指令。


  Python虚拟机内部。


  CPython使用基于堆栈的虚拟机。也就是说,它完全围绕堆栈数据结构运行(您可以将一个项目“推入”堆栈,将其放在堆栈结构的顶部,或者从堆栈的顶部“弹出”一个项目)。


  CPython使用三种类型的堆栈:


  调用堆栈。这是Python程序运行的主要结构。它有一个内容——“堆栈框架”——堆栈的底部是程序的入口。对于每个当前激活的函数调用,调用都会将新的栈帧推入调用栈,函数调用返回时会弹出相应的栈帧。


  在每个堆栈帧中,都有一个执行堆栈(也称为数据堆栈)。这个栈是执行Python函数的地方。执行Python代码主要包括将相关数据推入栈中,执行逻辑操作,然后从栈中弹出。


  在每个堆栈帧中,还有一个块堆栈。Python用它来跟踪某些类型的控制结构:循环块、try/except块和with块将所有相关内容推入块栈,当一个结构退出时,块栈弹出相应的内容。这个操作帮助Python知道在任何特定时间哪些块是活动的。例如,如果continue或break语句需要知道操作哪个特定的逻辑块,否则可能会影响逻辑块的正确性。


  虽然有些指令是用来执行其他操作的(比如跳转到特定的指令或者操作块栈),但是Python中的大多数字节码指令都是用来操作当前调用栈帧中的执行栈的。


  为了感受这一点,假设我们有一些调用函数的代码,比如my_function(my_variable,2)。Python将其转换为四个字节码指令的序列:


  一个LOAD_NAME指令,用于查找函数对象my_function,并将其推到执行堆栈的顶部。


  另一个LOAD_NAME指令找到变量my_variable,并将其推到执行堆栈的顶部。


  LOAD_CONST指令将常量值2推到执行堆栈的顶部。


  调用函数指令。


  CALL_FUNCTION指令的参数为2,这意味着Python需要从栈顶弹出两个位置参数;那么被调用的函数会在最前面,也可以弹出来(对于涉及关键字参数的函数,会使用不同的指令——CALL_FUNCTION_KW-_KW——但是操作原理类似,第三条指令会使用CALL_FUNCTION_EX来处理*或**相关参数的解包操作)。一旦Python准备好了,就会在调用栈上分配一个新的栈帧,为函数调用准备局部变量,在这个栈帧中执行my_function中的字节码。一旦完成,栈帧就会从调用栈中弹出,my_function的返回值会被推到原栈帧中执行栈的顶部。



  • 友情链接

关注东软睿道公众号了解更多IT行业资讯

添加东小萌微信
获取更多IT学习资源