模块编译
在上一小结中,运行完usemodule.py我们会发现module目录中除了一个testmodule.py文件以外,
还多了一个testmodule.pyc文件。其中testmodule.pyc就是Python将testmodule.py编译成字节码的文件。
虽然Python是脚本语言,但Python可以将脚本编译成字节码的形式。对于模块而言,Python总是在第一次调用
后将其编译成字节码的形式,以提高脚本的运行速度。
Python在导入模块时会查找模块的字节码文件,如果存在,则将编译后的模块的修改时间同模块的修改时间比较。
如果两者的修改时间不相符,那么Python将重新编译模块,以保证两者内容相符。被编译的脚本也是可以直接运行的。
没有必要去刻意编译Python脚本,不过,由于Python是脚本,如果不想将源文件发布,可以发布编译后的脚本,这样可以
起到一定的保护作用。
对于不作为模块的脚本而言,Python不会在运行脚本后将其编译成字节码的形式。如果想将其编译成字节码,可以使用
compileall模块。
如下代码所示将上一节中的usemodule.py编译成".pyc"文件。
# file: base_practise.py
#
import py_compile
py_compile.compile('usemodule.py')
运行base_practise.py后,可以看到当前目录会多了一个usemodule.pyc的文件。运行usemodule.pyc后输入如下。
$ python usemodule.pyc
我是一个模块
testmodule.py
usemodule.py
可以看到其输出与上一节输出一样。编译后生成的usemodule.pyc并没有改变程序功能,只是以Python字节码的形式存在。
另外可以通过Python的命令行选项将脚本优化编译。Python编译的优化选项有以下两个。
-O: 该选项对脚本的优化不多,编译后的脚本以".pyo"为扩展名。
凡是以".pyo"为扩展名的Python字节码都是经过优化的。
-OO: 该选项对脚本优化的程度较大,编译后的脚本以".pyo"为扩展名。使用该标志可以是编译的Python脚本更小。
使用改选项可以导致脚本运行错误,因此,应该谨慎使用。
可以通过在命令行中输入以下命令将usemodule.py优化编译。
python -O -m py_compile usemodule.py
python -OO -m py_compile usemodule.py
实力环境说明
# _*_ coding: utf-8 -*-
# version 2.7.13