“编译的” 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文件)。
最新评论