当前位置: 首页 > 后端技术 > Python

python字节码

时间:2023-03-25 23:01:13 Python

python字节码python编译过程py文件pycachepyc文件pyo文件python程序执行原理python编译过程日常生活中,Python代码一般不编译,拷贝几个py文件即可。再加上脚本语言的名称,有些不太了解Python的朋友会认为Python不编译这个过程。事实上,Python虽然是一种脚本语言,但它和Java、C#一样,只能执行字节码。只是Python隐藏了编译过程,并不明显。本章详细介绍了Python的编译过程和一些技巧。这里使用的python版本是3.6.6。py文件是python代码文件。这里准备两个py文件,用于后面的分析。使用mymodule.pyclassMyModule(object):defsay(self,name):print("Say...",name)demo.pyfrommymoduleimportMyModuletest=MyModule()test.say("Hello")运行演示。py方法在当前目录下会生成一个__pycache__目录进入这个目录我们看到一个文件mymodule.cpython-36。pyc这里有两个问题。什么是__pycache__目录?.pyc文件是什么?__pycache____pycache__是包含已编译和准备执行的Python3字节码的目录。第一次运行python脚本时,解释器会编译*.py脚本并将其保存到__pycache__目录中。这里有问题吗?我随便写一个文件,里面打印一句话,会不会有pycache目录?print("helloworld")实验表明不会生成这个pycache目录。这个目录只有在importxxx的时候才会生成。这个目录可以删除吗?删掉有什么影响?下次执行脚本时,如果解释器发现你的.py脚本没有变化,就会跳过编译步骤,直接运行__pycache__目录下保存的.pyc文件。执行python脚本会导致word段代码在内存中生成,并一直保留到程序关闭。如果你导入一个模块,为了更快的可重用性,Python将创建一个缓存.pyc(PYC是'Python''Compiled')文件,其中缓存导入模块的字节码。这个想法是通过避免在重新导入时重新编译来加速python模块加载(编译一次,运行多次策略)。文件名与模块名相同。初始点之后的部分表示创建缓存的Python实现(可能是CPython),后面是它的版本号。上面提到mymodule.cpython-36.pyc文件pyc文件python2代码操作是直接生成pyc文件python3代码操作是将pyc文件放到pycache目录下。pyc文件是将.py文件代码文件编译生成的byte,其加载速度较之前的.py文件有所提升,还可以实现源代码隐藏,对pyc文件进行一定程度的反编译,即一个由python编译的字节码(bytecode)文件。只要运行py文件,python编译器就会自动生成对应的pyc字节码文件。这个pyc字节码文件,通过python解释器,会生成机器码,运行下一个调用直接调用pyc,而不是调用py文件。直到你的py文件被改变。python解释器会检查pyc文件中的生成时间,比较py文件的修改时间。如果py更新了,会生成一个新的pyc。pyo文件pyo文件也是经过优化(注意这两个词,方便后续理解)的编译程序(比.pyc文件小),同样可以提高加载速度。但对于嵌入式系统,它可以将需要的模块编译成.pyo文件以减少容量。但总的来说,功能和原来的.py脚本差不多。Python所有选项中:-O,表示优化.pyo字节码的生成-OO,表示进一步去除-O选项生成的字节码文件中的文档字符串-m表示导入并运行指定模块执行下面命令查看是否生成了pyo文件#py_compile是Python自带的模块python-O-mpy_compiledemo.python-OO-mpy_compileDemo.py到pycache目录下看到cpython-36.opt-1.pyc文件生成。我们发现了如下结果:1.咦,之前约定生成的pyo文件呢?为什么又生成了pyc文件?2、两个pyc文件-O选项生成xxxx-1.pyc-OO选项生成xxxx-2.pyc这两个pyc有什么区别?查了资料发现从python3.5+开始去掉了pyo文件后缀,原来的pyo文件链接和PYC目录链接都去掉了。为什么官方要去掉pyo?看完这两篇文章,我可以简单总结一下:由于pyc文件在Python的主要版本之间不兼容,引入了一种更灵活的替代机制——pyc格式包含实现名称和版本号*.pyc文件可以代表优化和未优化的字节码。*.pyc文件名中可以??包含优化级别信息,优化级别:0:.pyc1(-O):.pyo2(-OO):.pyopython程序执行原理