我们知道编译型的语言都需要将源代码编译成可执行的程序,直接运行源代码是不可以的.Python是一门解释型的语言,源代码(.py
文件)无需编译就能直接运行,那么我们经常看到的.pyc
文件是什么,为什么会在程序启动后产生呢?这里很多人会认为这个是.py
文件在运行时被热编译产生的可运行文件,能加速Python的运行.但是很遗憾这个结论是错的,.pyc
的确是运行时产生的但是对程序的运行速度没有任何影响.
.pyc
是怎么产生的,有什么作用
“Compiled” Python files文档里面有明确的说明: Python程序运行时需要加载其依赖的模块,为了加速模块的加载速度,Python 把模块的编译版缓存在__pycache__
目录中,文件名为 module.version.pyc
,version
对编译文件格式进行编码,一般是Python的版本号.
例如,CPython的3.3发行版中,spam.py
的编译版本缓存为 __pycache__/spam.cpython-33.pyc
.使用这种命名惯例,可以让不同Python发行版及不同版本的已编译模块共存。
Python程序启动的时候会加载依赖模块,这时会产生.pyc
文件..pyc
产生后一般不会变动,除非py源文件也变化了,Python会对比编译版本与源码的修改日期,查看它是否已过期,是否要重新编译,此过程完全自动化.此外,编译模块与平台无关,因此,可在不同架构系统之间共享相同的支持库.
Python 在两种情况下不检查缓存:
- 从命令行直接载入模块,只重新编译,不存储编译结果
- 没有源模块,就不会检查缓存.为了支持无源文件(仅编译)发行版本,编译模块必须在源目录下,并且绝不能有源模块.
对于常见的直觉: .py
文件在运行时被热编译产生的可运行文件,能加速Python的运行. 实际上是错误的. 从.pyc
文件读取的程序不比从 .py
读取的执行速度快,.pyc
文件只是加载速度更快.
A program doesn’t run any faster when it is read from a .pyc file than when it is read from a .py file; the only thing that’s faster about .pyc files is the speed with which they are loaded.
此外,compileall
模块可以为一个目录下的所有模块创建.pyc
文件