为什么要编译Python代码?

你为什么要编译一个Python脚本? 你可以直接从.py文件运行它们,它可以正常工作,所以有一个性能优势或者什么?

我还注意到,我的应用程序中的某些文件被编译为.pyc,而其他文件则不会,为什么?


它被编译为字节码,可以更快速地使用这些字节码。

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

Ben Blank重要补充:

值得注意的是,虽然运行编译脚本的启动时间更快(因为它不需要编译),但运行速度并不快。


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

“Python简介”对编译的Python文件这样说道:

从'.pyc'或'.pyo'文件读取时,程序运行速度比从'.py'文件读取时运行速度快; 关于'.pyc'或'.pyo'文件的唯一更快的速度是它们被加载的速度。

运行.pyc文件的好处在于,Python在运行之前不必承担编译它的开销。 由于Python无论如何都会在运行.py文件之前编译为字节码,除此之外不应该有任何性能改进。

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

您在命令行上命名的脚本从不保存到.pyc文件。 只有通过该“主”脚本加载的模块才以这种方式保存。


加号:

第一:温和的,可战胜的混淆。

其次:如果编译产生的文件明显更小,则您将获得更快的加载时间。 很好的网络。

第三:Python可以跳过编译步骤。 在最初的负载下速度更快。 很好的CPU和网络。

第四:您评论越多, .pyc.pyo文件与源.py文件相比将会越小。

第五:手头只有.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文件中有一个“魔术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文件中被删除,并且这个功能会丢失。

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

    链接地址: http://www.djcxy.com/p/54805.html

    上一篇: Why compile Python code?

    下一篇: how do imports work for a module used as a singleton?