为了提高模块加载的速度,每个模块都会在 __pycache__
文件夹中放置该模块的预编译模块,命名为 module.version.pyc
, version
是模块的预编译版本编码,一般都包含 Python 的版本号。例如在 CPython 发行版 3.4 中,fibo.py
文件的预编译文件就是:__pycache__/fibo.cpython-34.pyc
。这种命名规则可以保证不同版本的模块和不同版本的 python 编译器的预编译模块可以共存。
脚本在运行之前会首先检查 python 文件的最后编辑日期和预编译模块的编译时间,从而决定是否需要重新编译。预编译模块也是跨平台的,所以不同的模块是可以在不同的系统和不同的架构之间共享的。
Python 在两种情况下不检查缓存。第一种,从命令行中直接加载的模块总是会重新编译并且结果不保存。第二种,如果没有源模块,则不会检查缓存。为了支持无源代码的部署方式,应该将预编译模块放在源代码文件夹中而不是 __pycache__
中,并且不要包含源代码模块。
你可以使用 -O
和 -OO
参数来降低预编译模块的大小。-O
开关会去除 assert
语句,-OO
开关会去除 assert
语句和 __doc__
字符串。因为有些模块要依赖这些语句,因此只有当你确认模块的内容时才去使用这些开关。优化模块的后缀名是 .pyo
。
.pyo
和 .pyc
文件的执行速度不会比 .py
文件快,快的地方在于模块加载的速度。
compileall 模块可以用来把某个文件夹的中的所有文件都编译成为 .pyc
或者 .pyo
文件。