“编译的” Python 文件,对于引用了大量标准模块的短程序,有一个提高启动速度的重要方法,如果在 spam.py
所在的目录下存在一个名为 spam.pyc
的文件,它会被视为 spam
模块的预“编译”( byte-compiled
,二进制编译)版本。用于创建 spam.pyc
的这一版 spam.py
的修改时间记录在 spam.pyc
文件中,如果两者不匹配,.pyc
文件就被忽略。
通常你不需要为创建 spam.pyc
文件做任何工作。一旦 spam.py
成功编译,就会尝试生成对应版本的 spam.pyc
。如果有任何原因导致写入不成功,生成的 spam.pyc
文件就会视为无效,随后即被忽略。spam.pyc
文件的内容是平台独立的,所以 Python 模块目录可以在不同架构的机器之间共享。
部分高级技巧:
- 以 -O 参数调用 Python 解释器时,会生成优化代码并保存在
.pyo
文件中。现在的优化器没有太多帮助;它只是删除了断言( assert)语句。使用 -O 参数,所有 的字节码(bytecode)都会被优化;.pyc
文件被忽略,.py
文件被编译为优化代码。 - 向 Python 解释器传递两个 -O 参数(-OO)会执行完全优化的二进制优化编译,这偶尔会生成错误的程序。现在的优化器,只是从字节码中删除了
__doc__
符串,生成更为紧凑的.pyo
文件。因为某些程序依赖于这些变量的可用性,你应该只在确定无误的场合使用这一选项。 - 来自
.pyc
文件或.pyo
文件中的程序不会比来自.py
文件的运行更快;.pyc
或.pyo
文件只是在它们加载的时候更快一些。 - 通过脚本名在命令行运行脚本时,不会将为该脚本创建的二进制代码写入
.pyc
或.pyo
文件。当然,把脚本的主要代码移进一个模块里,然后用一个小的启动脚本导入这个模块,就可以提高脚本的启动速度。也可以直接在命令行中指定一个.pyc
或.pyo
文件。 - 对于同一个模块(译者:这里指例程 spam.py),可以只有
spam.pyc
文件(或者spam.pyo
,在使用 -O 参数时)而没有spam.py
文件。这样可以打包发布比较难于逆向工程的 Python 代码库。 - compileall 模块可以为指定目录中的所有模块创建
.pyc
文件(或者使用 -O 参数创建.pyo
文件)。