Python中加载时间和运行时间的区别是什么?

3
我引用 Python 文档的一部分: “当从 .pyc 或 .pyo 文件读取程序时,它的运行速度并不比从 .py 文件读取时更快;.pyc 或 .pyo 文件唯一比 .py 文件快的是它们被加载的速度。”
它的意思是说,无论你使用 .pyc 或 .pyo 文件还是 .py 文件来运行程序,程序的运行速度都是一样的,没有区别。但是,使用 .pyc 或 .pyo 文件加载程序的速度会更快,因为这些文件已经被编译过了,可以直接被计算机读取和执行。所以,如果你需要反复加载同一个程序,使用 .pyc 或 .pyo 文件会更加高效。

2
Python解释器——实际上执行代码的程序——并不理解我们编写的Python代码。相反,它将其转换为一种较低级别的版本,称为“字节码”,并执行该字节码。这种转换需要时间,但只需要进行一次,因此结果存储在.pyc文件中以供以后使用。 - Katriel
@katrielalex:请以“答案”的形式回复您的响应。 - SingleNegationElimination
2个回答

3
当你导入一个名为test.py的模块时,Python必须读取源代码并将其转换为Python可以执行的字节码。这需要时间,但Python会将其存储在test.pyc中。这个字节码是将你的代码分解成更简单的术语,能够直接在CPython虚拟机上运行的结果。
如果你加载test.pyc,Python不需要在运行之前将你的源代码编译成字节码,因此启动时间稍微缩短。
如果你两次导入一个名为test.py的模块而不修改它或删除生成的test.pyc,Python会检查test.pyc是否存在并加载它 - 因此性能提升是自动的。

5
确切地说,.pyc 文件只有在导入 .py 文件时才会生成,而不是在运行时生成。 - Tim Pietzcker

2

将您编写的Python代码转换为计算机可以理解的指令有两个步骤:

  1. 一个编译步骤。原始的Python代码被转换为Python字节码。这个字节码将被任何操作系统上的Python解释器识别,在任何硬件上运行。这就是存储在.pyo或.pyc文件中的内容。

  2. 一个解释步骤。Python解释器(或者如果你喜欢Python虚拟机)解释字节码并向计算机发送低级指令。这些低级指令在Linux和Windows之间,或者在Intel芯片和AMD芯片之间都是不同的,因此必须为Python可以运行的每种类型的系统编写不同的解释器。

当您从.pyc文件运行代码时,第1步已经完成,因此执行直接进入第2步。但第2步的运行速度与立即编译后运行的速度一样快。编译步骤是否会显著减慢您的代码取决于程序的功能。您应该进行实验以了解等待代码编译需要多长时间的差异,但如果您编写的是短脚本,差异可能是无法察觉的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接