zmqNut

明知会散落, 仍不惧盛开

0%

关于__pycache__文件夹

最近在查看某个py程序时,发现很多模块下都存在一个名字为__pycache__ 文件夹,如下图所示。

image-20220526200618937

查阅相关资料现总结如下:

__pycache__ 文件夹是 Python 解释器自动生成的,用来存放编译的字节码

先大概了解一下python基本运行机制。Python程序运行时不需要编译成二进制代码,而直接从源码运行程序,简单来说是,Python解释器将源码转换为字节码,然后再由解释器来执行这些字节码。

解释器的具体工作:

  1. 完成模块的加载和链接;
  2. 将源代码编译为PyCodeObject对象(即字节码),写入内存中,供CPU读取;
  3. 从内存中读取并执行,结束后将PyCodeObject写回硬盘当中,也就是复制到.pyc.pyo文件中,以保存当前目录下所有脚本的字节码文件

之后若再次执行该脚本,它先检查[本地是否有上述字节码文件]和[该字节码文件的修改时间是否在其源文件之后],是就直接执行,否则重复上述步骤。

意义在于:第一次执行代码时,python解释器已经把编译的字节码放在了__pycache__文件夹中,这样以后再运行的话,如果被调用模块未发生改变,那就直接跳过编译这一步,直接去__pycache__文件夹中去运行相关的*.pyc文件,大大缩短了项目运行前的准备时间。

.pyc文件类型

当你导入一个模块时,解释器会自动生成.pyc文件,这样会节省下次导入的时间。注意,使用.pyc文件只是加速程序加载的时间,而不是加速程序执行的时间。

注意:因为.pyc文件是平台不相关的,所以可以在不同架构的机器上使用同一个.pyc文件。然而,如果开发者在他们的系统上使用不同的时钟时间,在生成.pyc文件的时候同时生成时间戳,将来其他的开发者读取这个时间戳,这可能导致对源码进行修改的时候不会修改字节码,这是一个不容易被发现的严重的bug。最好的方式就是把在进行版本控制的时候忽略.pyc文件。

文件夹下所产生的文件*.pyc没有必要提交到版本管理仓库上,可以通过在本地 Project 中的 .gitignore文件中增加 *.pyc.

.pyo文件类型

当有模块被导入的时候,解释器也会产生.pyo文件,只不过需要告诉解释器开启优化设置。产生.pyo文件就不再产生.pyc文件了(python3.5以前是.pyo,python3.5以后就是产生.opt-1.pyc文件)。源代码变化的时候,.pyo或.opt-1.pyc也会随着变化。

---------- End~~ 撒花ฅ>ω<*ฅ花撒 ----------