为什么主要的可运行Python脚本没有编译成模块这样的pyc文件?

Geo*_*e41 30 python

我知道当你导入一个模块时,该文件被编译成一个.pyc文件以使其更快?为什么主文件也没有编译成.pyc?这会减慢速度吗?保持主文件尽可能小是不是更好,还是没关系?

pyf*_*unc 31

加载模块时,py文件被"字节编译"为pyc文件.时间戳记录在pyc文件中. 这样做不是为了让它运行得更快,而是加载更快. 因此,在加载模块时"字节编译"模块是有意义的.

[编辑:包含备注,参考]

从PEP 3147"字节代码编译":

CPython将其源代码编译为"字节代码",并且出于性能原因,只要源文件发生更改,它就会将此字节代码缓存在文件系统上.这使得加载Python模块的速度更快,因为可以绕过编译阶段.当您的源文件是foo.py时,CPython将字节代码缓存在源旁边的foo.pyc文件中.

如何跟踪Python版本和"py"文件更改的字节码编译文件:

它还在编译的字节代码".pyc"文件中插入幻数.每当Python更改字节代码格式时(通常在主要版本中),这都会发生变化
这可确保为早期版本的VM构建的pyc文件不会导致问题.时间戳用于确保pyc文件与用于创建它的py文件匹配.当幻数或时间戳不匹配时,将重新编译py文件并写入新的pyc文件.

"pyc"文件在Python主要版本中不兼容.当Python找到具有不匹配幻数的pyc文件时,它会回退到重新编译源的较慢过程.

这就是原因,如果你只是分发为同一平台编译的".pyc"文件将不再工作,如果python版本更改.

在果壳中

如果有一个字节编译文件".pyc"并且它的时间戳表明它是最近的那么它将被加载其他明智的python将回退加载".py"文件的较慢方法.".py"文件的执行性能不受影响,但".pyc"文件的加载速度比".py"文件快.

考虑执行导入b.py的a.py.

Typical total performance = loading time (A.py) + execution time (A.py) + 
                            loading time (B.py) + execution time (B.py) 

Since loading time (B.pyc)  <  loading time (B.py)

You should see a better performance by using the byte compiled "pyc" files. 
Run Code Online (Sandbox Code Playgroud)

也就是说,如果你有一个大的脚本文件X.py,模块化它并将内容移动到其他模块导致利用较低的字节码编译文件的加载时间.

另一个推论是模块往往比脚本或主文件更稳定.因此它根本不是字节编译的.

参考