.pyc是什么[Python3 学习笔记]

492 阅读2分钟

我们知道编译型的语言都需要将源代码编译成可执行的程序,直接运行源代码是不可以的.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 在两种情况下不检查缓存:

  1. 从命令行直接载入模块,只重新编译,不存储编译结果
  2. 没有源模块,就不会检查缓存.为了支持无源文件(仅编译)发行版本,编译模块必须在源目录下,并且绝不能有源模块.

对于常见的直觉: .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 文件