为什么要编译Python代码?

2024-04-26 09:46:27 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
3条回答

它被编译成字节码,使用起来非常快。

某些文件未编译的原因是,每次运行脚本时都会重新编译使用python main.py调用的主脚本。所有导入的脚本都将被编译并存储在磁盘上。

通过Ben Blank

It's worth noting that while running a compiled script has a faster startup time (as it doesn't need to be compiled), it doesn't run any faster.

pyc文件是已经编译成字节码的Python。如果Python找到与调用的.py文件同名的.pyc文件,它将自动运行该文件。

“Python简介”says关于编译的Python文件:

A program doesn't run any faster when it is read from a ‘.pyc’ or ‘.pyo’ file than when it is read from a ‘.py’ file; the only thing that's faster about ‘.pyc’ or ‘.pyo’ files is the speed with which they are loaded.

运行.pyc文件的好处是,在运行之前,Python不必产生编译它的开销。由于Python无论如何都会在运行.py文件之前编译成字节码,因此除了这一点之外,不应该有任何性能改进。

使用编译后的.pyc文件可以改进多少?这取决于脚本的作用。对于一个简单打印“Hello World”的简单脚本,编译可能占整个启动和运行时间的很大一部分。但是,对于运行时间较长的脚本,编译脚本相对于总运行时间的成本会降低。

您在命令行中命名的脚本永远不会保存到.pyc文件中。只有由“main”脚本加载的模块才会以这种方式保存。

优点:

第一种:轻微的,可克服的混淆。

第二:如果编译的结果是一个非常小的文件,那么您将获得更快的加载时间。对网络很好。

第三:Python可以跳过编译步骤。初载时更快。很适合CPU和网络。

第四:注释越多,.pyc.pyo文件与源文件相比就越小。

第五:只有一个.pyc.pyo文件的最终用户不太可能向您显示一个错误,该错误是由他们忘记告诉您的未还原的更改引起的。

第六:如果你瞄准的是嵌入式系统 要嵌入的文件可能代表一个重要的优点,而且体系结构是稳定的,因此下面详细介绍的缺点之一不会起作用。

顶级编译

知道您可以这样将顶级python源文件编译成.pyc文件是很有用的:

python -m py_compile myscript.py

这将删除注释。它使docstrings保持完整。如果您也希望摆脱docstrings(您可能需要认真考虑为什么要这样做),那么请用这种方式编译。。。

python -OO -m py_compile myscript.py

…您将得到一个.pyo文件,而不是一个.pyc文件;就代码的基本功能而言,它同样可以分发,但比剥离出来的docstrings的大小要小(而且,如果它首先有像样的docstrings就不太容易理解,以便以后使用)。但见下面的第三个缺点。

请注意,python使用.py文件的日期(如果存在的话)来决定它是否应该执行.py文件,而不是.pyc.pyo文件——所以编辑您的.py文件,并且.pyc.pyo已经过时,您获得的任何好处都将丢失。您需要重新编译它,以便再次获得.pyc.pyo好处,如它们可能是。

缺点:

第一:在.pyc.pyo文件中有一个“magic cookie”,表示编译python文件的系统架构。如果将这些文件中的一个分发到不同类型的环境中,它将中断。如果您分发.pyc.pyo而没有相关的.py来重新编译或touch,因此它将取代.pyc.pyo,则最终用户也无法修复它。

第二:如果使用如上所述的-OO命令行选项跳过docstrings,则任何人都无法获取该信息,这会使代码的使用更加困难(或不可能)

第三:Python的-OO选项还根据-O命令行选项实现了一些优化;这可能会导致操作的更改。已知的优化是:

  • sys.flags.optimize=1
  • assert语句被跳过
  • __debug__=错误

第四:如果您故意让python脚本在第一行以#!/usr/bin/python的顺序执行,那么这将在.pyc.pyo文件中被删除,并且该功能将丢失。

第五:有点明显,但是如果你编译你的代码,不仅它的使用会受到影响,而且其他人从你的工作中学到东西的可能性也会降低,通常是严重的。

相关问题 更多 >