公司网站建设中心,二手网站建设的策划,百度推广要多少钱,南昌网站建设的流程编译Python文件
一、编译Python文件
为了提高加载模块的速度#xff0c;强调强调强调#xff1a;提高的是加载速度而绝非运行速度。python解释器会在__pycache__目录中下缓存每个模块编译后的版本#xff0c;格式为#xff1a;module.version.pyc。通常会包含python的版本号…编译Python文件
一、编译Python文件
为了提高加载模块的速度强调强调强调提高的是加载速度而绝非运行速度。python解释器会在__pycache__目录中下缓存每个模块编译后的版本格式为module.version.pyc。通常会包含python的版本号。例如在CPython3.3版本下spam.py模块会被缓存成__pycache__/spam.cpython-33.pyc。这种命名规范保证了编译后的结果多版本共存。
Python检查源文件的修改时间与编译的版本进行对比如果过期就需要重新编译。这是完全自动的过程。并且编译的模块是平台独立的所以相同的库可以在不同的架构的系统之间共享即pyc使一种跨平台的字节码类似于JAVA, .NET,是由python虚拟机来执行的但是pyc的内容跟python的版本相关不同的版本编译后的pyc文件不同2.5编译的pyc文件不能到3.5上执行并且pyc文件是可以反编译的因而它的出现仅仅是用来提升模块的加载速度的不是用来加密的。
# python解释器在以下两种情况下不检测缓存
1. 如果是在命令行中被直接导入模块则按照这种方式每次导入都会重新编译并且不会存储编译后的结果python3.3以前的版本应该是这样
python -m spam.py
2. 如果源文件不存在那么缓存的结果也不会被使用如果想在没有源文件的情况下来使用编译后的结果则编译后的结果必须在源目录下
sh-3.2 # ls
__pycache__ spam.py
sh-3.2 # rm -rf spam.py
sh-3.2 # mv __pycache__/spam.cpython-36.pyc ./spam.pyc
sh-3.2 # python3 spam.pyc
spam
# 提示
1. 模块名区分大小写foo.py与FOO.py代表的是两个模块
2. 你可以使用-O或者-OO转换python命令来减少编译模块的大小
-O转换会帮你去掉assert语句
-OO转换会帮你去掉assert语句和__doc__文档字符串
由于一些程序可能依赖于assert语句或文档字符串你应该在在确认需要
的情况下使用这些选项。
3. 在速度上从.pyc文件中读指令来执行不会比从.py文件中读指令执行更快只有在模块被加载时.pyc文件才是更快的
4. 只有使用import语句是才将文件自动编译为.pyc文件在命令行或标准输入中指定运行脚本则不会生成这类文件因而我们可以使用compieall模块为一个目录中的所有模块创建.pyc文件
模块可以作为一个脚本使用python -m compileall编译Python源
python -m compileall /module_directory 递归着编译
如果使用python -O -m compileall /module_directory -l则只一层
命令行里使用compile()函数时自动使用python -O -m compileall
详见https://docs.python.org/3/library/compileall.html#module-compileall
二、批量生成.pyc文件
import compileall
compileall.compile_dir($dir)
其中$dir 为Python源代码所在的目录。
三、总结
编译Python文件编译文件提高的是加载速度而绝非运行速度