6.1.3. “编译过的”Python文件
为了加速模块载入,Python在 __pycache__
目录里缓存了每个模块的编译后版本,名称为 module.*version*.pyc
,其中名称中的版本字段对编译文件的格式进行编码; 它一般使用Python版本号。例如,在CPython版本3.3中,spam.py的编译版本将被缓存为 __pycache__/spam.cpython-33.pyc
。此命名约定允许来自不同发行版和不同版本的Python的已编译模块共存。
Python根据编译版本检查源的修改日期,以查看它是否已过期并需要重新编译。这是一个完全自动化的过程。此外,编译的模块与平台无关,因此可以在具有不同体系结构的系统之间共享相同的库。
Python在两种情况下不会检查缓存。首先,对于从命令行直接载入的模块,它从来都是重新编译并且不存储编译结果;其次,如果没有源模块,它不会检查缓存。为了支持无源文件(仅编译)发行版本, 编译模块必须是在源目录下,并且绝对不能有源模块。
给专业人士的一些小建议:
你可以在Python命令中使用
-O
或者-OO
开关, 以减小编译后模块的大小。-O
开关去除断言语句,-OO
开关同时去除断言语句和 __doc__ 字符串。由于有些程序可能依赖于这些,你应当只在清楚自己在做什么时才使用这个选项。“优化过的”模块有一个opt-
标签并且通常小些。将来的发行版本或许会更改优化的效果。一个从
.pyc
文件读出的程序并不会比它从.py
读出时运行的更快,.pyc
文件唯一快的地方在于载入速度。compileall
模块可以为一个目录下的所有模块创建.pyc文件。关于这个过程,PEP 3147 中有更多细节,包括一个决策流程图。