为什么 .pyc 文件的“运行”速度与 .py 文件相比没有更快?

18
我知道 .py 和 .pyc 文件的区别。我的问题不是关于如何,而是关于为什么。根据文档
引用:

从 .pyc 或 .pyo 文件读取程序并不能使它运行得更快;唯一可以加速的是 .pyc 或 .pyo 文件加载的速度

.pyc 文件可以更快地加载导入内容。但是,在加载完 'running' 部分之后,.pyc 文件和 .py 文件的 'running' 部分花费的时间相同?为什么会这样?我原以为:
  • 位码(.pyc)更接近 Python 虚拟机,因此运行更快
  • .py 文件在执行之前被编译成 .pyc 文件。这需要额外的步骤,因此会耗费时间。
我的问题是:在导入部分之后,为什么 .pyc 文件的运行部分与 .py 文件相比不能加速执行?

".py文件在执行之前会被编译成.pyc文件。这需要额外的步骤,因此会耗费时间。是的,这也正是它们运行速度快的原因:因为“运行”意味着那个步骤之后,而在那个步骤之后只有编译后的代码。在导入部分之后,为什么.pyc文件的运行部分与.py文件相比不会加速执行?因为加载是可以加速的部分。" - Karl Knechtel
3个回答

26
当您运行一个 .py 文件时,它首先会被编译成字节码,然后执行。加载这样的文件会更慢,因为对于一个 .pyc 文件,编译步骤已经完成,但是在加载后,仍需要执行相同的字节码解释。
在伪代码中,Python 解释器执行以下算法:
code = load(path)
if path.endswith(".py"):
    code = compile(code)
run(code)

1
以编程方式编译 .py 文件:import py_compilepy_compile.compile('Hello.py')
  • 这将生成 Hello_cpython-36.pyc(根据您使用的实现而定)
- maris

12

程序的运行方式总是相同的,编译后的代码会被解释执行。

程序的加载方式有所不同。如果存在当前的pyc文件,那么它将作为编译版本,因此在运行命令之前不需要进行编译步骤。否则,将读取py文件,编译器需要对其进行编译(这需要一些时间),但之后内存中的编译版本将像其他方式一样被解释执行。


0
程序的运行时间是指当所有内容都被编译并执行时的时间。已经编译好的文件并不能加快执行时间,它只能加快到达执行阶段的时间(将所有文件编译成字节码)。
因此,在你的第二点中,将编译时间计算在执行时间中是不正确的。当我们测量来自不同语言的程序的执行时间时,所有文件都已经被编译好并准备就绪。

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