> 文章列表 > python pyc文件

python pyc文件

python pyc文件

参考自

What are pyc files in Python

和Python什么情况下会生成pyc文件? - 知乎

加上了我自己的理解

官方文档有这么解释

  • A program doesn't run any faster when it is read from a ‘.pyc’ or ‘.pyo’ file than when it is read from a ‘.py’ file; the only thing that's faster about ‘.pyc’ or ‘.pyo’files is the speed with which they are loaded.
  • 从'.pyc'或'.pyo'文件中读取的程序并不比从'.py'文件中读取的程序快;'.pyc'或'.pyo'文件唯一快的地方是它们的加载速度。
  • When a script is run by giving its name on the command line, the bytecode for the script is never written to a ‘.pyc’ or ‘.pyo’ file. Thus, the startup time of a script may be reduced by moving most of its code to a module and having a small bootstrap script that imports that module. It is also possible to name a ‘.pyc’ or ‘.pyo’file directly on the command line.
  • 当一个脚本通过在命令行上给出它的名字来运行时,该脚本的字节码不会被写入'.pyc'或'.pyo'文件中。因此,通过将脚本的大部分代码转移到一个模块中,并有一个导入该模块的小型引导脚本,可以减少脚本的启动时间。也可以直接在命令行上命名一个'.pyc'或'.pyo'文件。

在 Python 中,.pyc 文件是在导入或执行 Python 脚本时由 Python 解释器生成的编译字节码文件。.pyc 文件包含编译后的字节码,可以直接由解释器执行,而不需要每次运行脚本时都重新编译源代码。这可以加快脚本执行时间,尤其是对于大型脚本或模块。

具体流程

  • 完成模块的加载和链接;
  • 将源代码翻译为PyCodeObject对象(这货就是字节码),并将其写入内存当中(方便CPU读取,起到加速程序运行的作用);
  • 从上述内存空间中读取指令并执行;
  • 程序结束后,根据命令行调用情况(即运行程序的方式)决定是否将PyCodeObject写回硬盘当中(也就是直接复制到.pyc或.pyo文件中);
  • 之后若再次执行该脚本,则先检查本地是否有上述字节码文件。有则执行,否则重复上述步骤。

也就是.py文件->必须经过python解释器->pyc文件 才能被python虚拟机执行,只有pyc文件才能被运行,但有的文件并没有保存pyc,是因为将其从内存写入硬盘是一件耗费时间的事,python会选择性地保留pyc。

.pyc 文件是在导入 .py 文件时由 Python 解释器创建的(py文件只要运行就要创建pyc)。它们包含导入模块/程序的“已编译字节码”,因此如果 .pyc 比相应的 .py 更新,模块在每次导入前总会检查其字节码文件的修改时间是否与自身的一致,如果二者修改时间不一致,则认为要重新编译pyc文件若一致则可以在后续导入时跳过从源代码到字节码的“翻译”(因为这个过程只需完成一次)文件,从而加快启动速度一点。但它仍然被解释。一旦生成*.pyc 文件,就不需要*.py 文件,除非您编辑它(也就是py文件比pyc文件更新了)。

关于 .pyc 文件的要点

以下是有关 .pyc 文件的一些要点:

  • 导入或执行 Python 脚本时,Python 解释器会自动生成 .pyc 文件。
  • .pyc 文件与相应的 .py 文件的存储结构如下所示,.pyc 文件存储在__pycache__文件夹中,以sptr_cuda为例

 可以看到二者的修改时间确实是完全一样的。

  • 并且与 .py 文件具有相同的名称,只是扩展名为 .pyc 而不是 .py。
  • .pyc 文件特定于用于生成它们的 Python 版本。如果您尝试使用不同版本的 Python 运行 .pyc 文件,您可能会遇到错误或意外行为。
  • 当一个脚本通过在命令行上给出它的名字来运行时,该脚本的字节码不会被写入'.pyc'或'.pyo'文件中

  • 只有pyc文件没有py文件也是完全可以运行的(已测试)

 

.pyc 文件是如何生成的

以下是 .pyc 文件如何在 Python 中生成和使用的一些示例:

例子:

导入 Python 模块会生成一个 .pyc 文件:

# my_module.py 
def my_function(): print("Hello, world!") 
# main.py 
import my_module 
my_module.pyc file和main.py都会生成pyc,因为两个都要执行,但 my_module.pyc会从内存导出到磁盘,供下次使用

例子:

如果 .pyc 文件已经存在并且是最新的,Python 将使用它而不是重新编译源代码:

# my_module.py 
def my_function(): print("Hello, world!") 
# main.py 
import my_module 
# This will use the existing my_module.pyc file, if it is up-to-date

例子:

如果脚本或模块的源代码发生变化,Python 将重新编译字节码并生成一个新的 .pyc 文件:

# my_module.py 
def my_function(): print("Hello, world!!!!!!!!!!!!!!!!!!!!!")# main.py 
import my_module 
# 
This will cause Python to recompile my_module.py and generate a new my_module.pyc file 
the next time main.py is run

通过使用 .pyc 文件,Python 可以避免每次运行脚本时重新编译相同源代码的开销。这可以导致更快的脚本执行时间和更有效地使用系统资源。但是,请务必记住,.pyc 文件特定于生成它们的 Python 版本,不应跨不同版本的 Python 使用。

关于优化 .pyc 文件

如果使用 -O 选项运行 Python 脚本,将优化 .pyc 文件,生成pyo文件。