最近在查看某个py程序时,发现很多模块下都存在一个名字为__pycache__
文件夹,如下图所示。
查阅相关资料现总结如下:
__pycache__
文件夹是 Python 解释器自动生成的,用来存放编译的字节码
先大概了解一下python基本运行机制。Python程序运行时不需要编译成二进制代码,而直接从源码运行程序,简单来说是,Python解释器将源码转换为字节码,然后再由解释器来执行这些字节码。
解释器的具体工作:
- 完成模块的加载和链接;
- 将源代码编译为
PyCodeObject
对象(即字节码),写入内存中,供CPU读取; - 从内存中读取并执行,结束后将
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
也会随着变化。