您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么主要的可运行Python脚本未编译为模块等pyc文件?

为什么主要的可运行Python脚本未编译为模块等pyc文件?

加载模块时,会将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.

就是说,如果您有一个大型脚本文件X.py,则将其模块化并将内容移动到其他模块将导致字节码编译文件的加载时间减少。

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

参考文献

python 2022/1/1 18:32:01 有218人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶