当 Python 执行代码的时候,会启用一个 Python 解释器,将源码(.py)文件读取到内存当中,然后编译成字节码(.pyc)文件,最后交给 Python 的虚拟机逐行解释并执行其内容,然后释放内存,退出程序。
当第二次在执行当前程序的时候,会现在当前目录下寻找有没有同名的 pyc 文件,如果找到了,则直接进行运行,否则重复上面的工作。
pyc 文件的目的其实就是为了实现代码的重用,为什么这么说呢?因为 Python 认为只要是 import 导入过来的文件,就是可以被重用的,那么他就会将这个文件编译成 pyc 文件。
python 会在每次载入模块之前都会先检查一下 py 文件和 pyc 文件的最后修改日期,如果不一致则重新生成一份 pyc 文件,否则就直接读取运行。
以上是我的个人理解,不知道对不对,求解。
三叔2016-10-22 16:31:40
在 Python 的世界中,一切都是对象,函数也是对象,类型也是对象,类也是对象(类属于自定义的类型,在 Python 2.2 之前,int, dict 这些内置类型与类是存在不同的,在之后才统一起来,全部继承自 object),甚至连编译出来的字节码也是对象,.pyc 文件是字节码对象(PyCodeObject)在硬盘上的表现形式。
在运行期间,编译结果也就是 PyCodeObject 对象,只会存在于内存中,而当这个模块的 Python 代码执行完后,就会将编译结果保存到了 pyc 文件中,这样下次就不用编译,直接加载到内存中。pyc 文件只是 PyCodeObject 对象在硬盘上的表现形式。
这个 PyCodeObject 对象包含了 Python 源代码中的字符串,常量值,以及通过语法解析后编译生成的字节码指令。PyCodeObject 对象还会存储这些字节码指令与原始代码行号的对应关系,这样当出现异常时,就能指明位于哪一行的代码。