当前位置: 首页 > 面试题库 >

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

吴凯泽
2023-03-14
问题内容

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


问题答案:

加载模块时,会将py文件“字节编译”为pyc文件。时间戳记录在pyc文件中。 这样做不是为了使其运行更快,而是使其加载更快。
因此,在加载模块时“字节编译”模块是有意义的。

  • http://docs.python.org/tutorial/modules.html#compiled-python-files

[编辑:包括注释,参考文献]

从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,则将其模块化并将内容移动到其他模块将导致字节码编译文件的加载时间减少。

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

参考文献

  • http://effbot.org/zone/python-compile.htm
  • http://www.network-theory.co.uk/docs/pytut/CompiledPythonfiles.html


 类似资料:
  • 输入一个模块相对来说是一个比较费时的事情,所以Python做了一些技巧,以便使输入模块更加快一些。一种方法是创建 字节编译的文件 ,这些文件以.pyc作为扩展名。字节编译的文件与Python变换程序的中间状态有关(是否还记得Python如何工作的介绍?)。当你在下次从别的程序输入这个模块的时候,.pyc文件是十分有用的——它会快得多,因为一部分输入模块所需的处理已经完成了。另外,这些字节编译的文件

  • 我已经安装了Python 3.5附带的Lubuntu 16.04 LTS,但使用Python 2.7作为默认的Python解释器。< br >两个版本都没有安装< code>pip包。我只会使用3.5版本。因此,我安装了< code>pip3,其中包含: 然后我尝试更新版本(因为Ubuntu存储库有旧版本):$ pip3安装--升级pip3但是找不到包,并给我发了这条消息: 收集pip3<br>找

  • 问题内容: 为什么要编译Python脚本?您可以直接从.py文件运行它们,并且效果很好,那么在性能上有什么优势吗? 我还注意到,我的应用程序中的某些文件被编译为.pyc,而另一些则没有,为什么? 问题答案: 它被编译为字节码,可以更快,更快速地使用。 无法编译某些文件的原因是,每次运行脚本时都会重新编译与之一起调用的主脚本。所有导入的脚本将被编译并存储在磁盘上。 Ben Blank的 重要补充:

  • 问题内容: 我有一个Python脚本,希望将其编译为Windows可执行文件。现在,在Windows上可以正常运行,但是我希望能够在Linux上运行它。我的开发机器上 确实 有Windows,但是Linux是我的主要开发平台,我有点讨厌重新启动Windows只是为了创建Windows 。我也不需要购买第二个Windows许可证即可在VirtualBox等虚拟机中运行。有任何想法吗? PS:我知道,

  • 我已将Python代码转换为文件使用。当我打开文件写入错误: 出现此错误,但程序不会自行关闭。

  • 我的操作系统是 Debian Buster。我的 cgi-bin 在 /var 中。CPAN 模块是 HTML::Template,位于 cpanm 安装的 /perl5/lib/perl5/HTML 中。我的服务器是 Apache2,我所做的所有研究似乎都正确配置了(但一定是某处出了问题)。我的浏览器是 火狐 ,但我也使用 curl 进行测试。我可以成功地从localhost/cgi-bin/运