python 中,什么是 .pyc 文件?这篇文章告诉你

文章目录

  • 什么是 .pyc文件?
    • 1. Python是一门解释型语言?
    • 2. 解释型语言和编译型语言
    • 3. Python到底是什么
    • 4. 简述Python的运行过程
    • 5. 给专业人士的一些建议
    • 6. 参考链接

什么是 .pyc文件?

  • 在 Python 程序中,是把原始程序代码放在.py 文件里,而 Python 会在执行.py 文件的时候。将.py 形式的程序编译成中间式文件(byte-compiled)的 .pyc 文件,目的就是为了加快下次执行文件的速度。

  • 所以,在我们运行 python 文件的时候,就会自动首先查看是否具有 .pyc 文件,如果有的话,而且 .py 文件的修改时间和 .pyc 的修改时间一样,就会读取.pyc 文件,否则,Python就会读原来的.py文件。

  • 其实并不是所有的.py文件在与运行的时候都会产生.pyc文件,只有在 import 相应的 .py 文件的时候,才会生成相应的 .pyc 文件

1. Python是一门解释型语言?

Python 是一门解释性语言,我就这样一直相信下去,直到发现了 .pyc 文件的存在。如果是解释型语言,为什么要编译呢?生成的 .pyc文件又是啥?c 应该是compiled 的缩写才对啊!

2. 解释型语言和编译型语言

计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个“翻译机”来从事把高级语言转变成计算机能读懂的机器语言的过程。

这个过程分成两类,第一种是编译,第二种是解释。

  1. 编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行生成的可执行的文件就可以了。最典型的例子就是C语言。

  2. 解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby。

通过以上的例子,我们可以来总结一下解释型语言和编译型语言的优缺点,因为编译型语言在程序运行之前就已经对程序做出了“翻译”,所以在运行时就少掉了“翻译”的过程,所以效率比较高。但是我们也不能一概而论,一些解释型语言也可以通过解释器翻译的时候对程序进行优化,从而提高效率。

此外,随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种。

用 Java 来举例,Java 首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说 Java 是一种先编译后解释的语言。

3. Python到底是什么

其实 Python 和 Java/C# 一样,也是一门基于虚拟机的语言,我们先来从表面上简单地了解一下 Python 程序的运行过程吧。

当我们在命令行中输入 python hello.py 时,其实是激活了Python的“解释器”,告诉“解释器”:你要开始工作了。可是在“解释”之前,其实执行的第一项工作和 Java 一样,是编译。

熟悉 Java 的同学可以想一下我们在命令行中如何执行一个Java的程序:

javac hello.java
java hello

只是我们在用 Eclipse 之类的IDE时,将这两部给融合成了一部而已。其实 Python 也一样,当我们执行 python hello.py 时,他也一样执行了这么一个过程,所以我们应该这样来描述 Python,Python是一门先编译后解释的语言

4. 简述Python的运行过程

在说这个问题之前,我们先来说两个概念,PyCodeObject 和 pyc 文件。

我们在硬盘上看到的 pyc 自然不必多说,而其实 PyCodeObject 则是 Python 编译器真正编译成的结果。我们先简单知道就可以了,继续向下看。

当 python 程序运行时,编译的结果则是保存在位于内存中的 PyCodeObject 中,当Python程序运行结束时,Python 解释器则将 PyCodeObject 写回到 pyc 文件中。

当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,先对.pyc文件和.py文件的最近一次的修改时间进行判断,如果.pyc文件的修改时间晚于.py文件,说明.py文件中的源代码未修改过,则直接载入,否则就重复上面的过程。

所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。

5. 给专业人士的一些建议

  1. 当使用该-O标志调用 Python 解释器时,会生成优化的代码并将其存储在.pyo文件中。优化器目前没有太大帮助;它只删除assert语句。当 -O被使用时,所有的 字节码被优化; .pyc文件被忽略,.py文件被编译为优化的字节码。

  2. 将两个-O标志传递给 Python 解释器 ( -OO) 将导致字节码编译器执行优化,这在极少数情况下可能会导致程序出现故障。目前只__doc__从字节码中删除字符串,从而生成更紧凑的.pyo文件。由于某些程序可能依赖于提供这些功能,因此只有在您知道自己在做什么时才应使用此选项。

  3. 一个程序从.pyc或 .pyo文件中读取时的运行速度并不比从文件中读取时快.py;.pyc或.pyo文件唯一更快的是加载它们的速度。

  4. 当脚本通过在命令行中给出其名称来运行时,脚本的字节码永远不会写入.pyc或.pyo文件。因此,脚本的启动时间可以通过将其大部分代码移动到一个模块并使用一个导入该模块的小型引导脚本来减少。也可以直接在命令行上命名一个.pyc或.pyo文件。

  5. 可以在没有文件的情况下调用spam.pyc(或spam.pyo 何时-O使用)spam.py同一模块的文件。这可用于以中等难度进行逆向工程的形式分发 Python 代码库。

  6. 模块compileall可以为目录中的所有模块创建.pyc文件(或使用.pyo 时的文件-O)。

6. 参考链接

参考链接1: https://www.cnblogs.com/zoe233/p/6993972.html
参考链接2: https://docs.python.org/zh-cn/2.7/tutorial/modules.html
参考链接3: https://www.cnblogs.com/zyy98877/p/8650119.html

你可能感兴趣的:(Python,基础语法学习,.pyc,python)