python之什么是字节码(bytecode)?
简单的说它就是一个从源代码编译而来的中间文件(用于不同操作系统平台的解释器执行)。比如,a说日语,b说中文,沟通起来不畅通,请一个翻译,把a和b的语言都翻译成英语,这个英语就可以理解成bytecode,一种中间语言。
bytecode的好处就是加载快,而且可以跨平台,同样一份bytecode,只要有操作系统平台上有相应的Python解释器,就可以执行,而不需要源代码。不同版本的Python编译的字节码是不兼容的,Python2.6编译的bytecode拿到Python2.7上去执行就不行了。
如何生成字节码?
Python解释器一般会自动把.py文件转换成bytecode,然后再执行它。当你第一次把.py文件当作module导入,或者对应的.py文件比.pyc文件的修改时间还要新时,Python解释器都会再从sourcecode生成相应的新bytecode。这样当你下次再次运行程序时,就会直接从bytecode运行,从而节省便宜时间。
Ps:这里需要注意,有些情况bytecode并不会生成:
遇到目录写权限的问题时。(比如你编写代码和运行代码使用的具有不同权限的用户角色,Linux上很常见)
运行一个script并不会被当成是import操作,所以可能也不会生成bytecode。(比如:你有个一个a.py的文件,其中在a.py里,你import了b.py,那么运行pythona.py后,会生成b.pyc,而不会生成a.pyc)
.pyc文件是什么?
Python源码编译的结果就是PyCodeObject,每个作用域会编译出一个对应的代码对象,其中名为co_code的PyStringObject保存着代码对象的字节码。
一个Python源文件就是一个模块。每个模块顶层的代码对象通过marshal序列化之后就得到了.pyc文件。marshal以little-endian字节序来序列化数据。
那嵌套于顶层作用域里面的那些作用域,例如函数、类的定义,它们对应的代码对象在哪里?它们每一个都乖乖的躺在上一层作用域的代码对象的co_const(常量池)域里,所以其实顶层代码对象已经嵌套包含了底下其它作用域的代码对象。
如何对.pyc文件文件进行反编译?
python文件如果要发布的话,有时候还是难免想保护一下自己的源码,有些人就直接编译成了pyc文件,因为这样既可以保留跨平台的特性,又可以不能直接看到代码,也看到网上很多人说为了保护自己的代码可以编译成pyc文件。
用pyc文件可以保护python代码的想法其实是不正确的,pyc文件是可以很容易被反编译的,比如说比较著名的uncompyle6库(https://github.com/rocky/python-uncompyle6),用来反编译文件最爽不过了,几乎支持python全版本的pyc文件的反编译。
为什么要做代码分析?
一般来说,代码分析重要性的判断比较主观,不同的人有不同的认识。Python是用C来实现的,所以对于Python的性能或代码质量的评估可以通过dis模块获取到对应的字节码指令来进行评估。
一般来说一个Python语句会对应若干字节码指令,Python的字节码是一种类似汇编指令的中间语言,但是一个字节码指令并不是对应一个机器指令(二进制指令),而是对应一段C代码,而不同的指令的性能不同,所以不能单独通过指令数量来判断代码的性能,而是要通过查看调用比较频繁的指令的代码来确认一段程序的性能。
一个Python的程序会有若干代码块组成,例如一个Python文件会是一个代码块,一个类,一个函数都是一个代码块,一个代码块会对应一个运行的上下文环境以及一系列的字节码指令。
dis模块主要是用来分析字节码的一个内置模块。dis模块的文档可以让你遍历它的内容,并且提供一个字节码指令能够做什么和有什么样的参数的完整清单。
以上内容为大家介绍了python之什么是字节码(bytecode)?希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。http://www.mobiletrain.org/
相关推荐HOT
更多>>python字符串和Java字符串
接下来,又到了Python字符串与Java字符串PK的时刻。Java中有比较字符串的方法,即compareTo()方法与equals()方法,前一个方法逐一比较两个字符...详情>>
2023-11-13 21:55:38七本经典python书籍
如果你想学习Python,市场上有许多可用的资源,本文我们为广大初学者们推荐7本最经典的Python书籍,这些书籍都非常受欢迎,你可以根据自己的需...详情>>
2023-11-13 21:07:28用Python的特性来切片无限生成器
注解推迟评估在Python3.7中,只要激活了正确的__future__标志,注解在运行时就不会被评估:from__future__importannotationsdefanother_brick(详情>>
2023-11-13 20:04:43Python实现文章自动生成
下面的Python程序实现了通过从网页抓取一篇文章,然后根据这篇文章来生成新的文章,这其中的原理就是基于概率统计的文本分析。过程大概就是网页...详情>>
2023-11-13 16:46:21