当前位置:  开发笔记 > 编程语言 > 正文

为什么要编译Python代码?

如何解决《为什么要编译Python代码?》经验,为你挑选了7个好方法。

为什么要编译Python脚本?你可以直接从.py文件运行它们并且它工作正常,那么是否有性能优势?

我还注意到我的应用程序中的一些文件被编译成.pyc而其他文件没有编译,为什么会这样?



1> Georg Schöll..:

它被编译为字节码,可以使用更多,更快,更快.

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

Ben Blank的重要补充:

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


值得注意的是,虽然运行已编译的脚本具有更快的*启动*时间(因为它不需要编译),但它不会*运行*更快.
一种常见的误解.感谢分享.

2> Bill Karwin..:

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

"到Python简介" 说这有关编译Python文件:

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

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

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

您在命令行上命名的脚本永远不会保存到.pyc文件中.只有那个"主"脚本加载的模块才会以这种方式保存.


在许多情况下,很难看出差异,但我有一个超过300,000行的特定python文件.(这是由另一个用于测试的脚本生成的一堆数学计算)编译需要37秒,执行只需2秒.

3> fyngyrz..:

加号:

第一:温和,可失败的混淆.

第二:如果编译导致文件明显变小,您将获得更快的加载时间.对网络很好.

第三:Python可以跳过编译步骤.初始负载更快.适合CPU和网络.

第四:评论越多,.pyc或者.pyo文件与源.py文件相比越小.

第五:只有一个.pyc或一个.pyo文件在手的最终用户不太可能向他们提供他们忘记告诉你的未恢复的更改所造成的错误.

第六:如果你的目标是嵌入式系统,那么获得一个较小尺寸的嵌入式文件可能代表了一个重要的优势,并且该架构是稳定的,因此下面详述的缺陷不起作用.

顶级编译

知道你可以用.pyc这种方式将顶级python源文件编译成文件是很有用的:

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再次获益,例如它们可能.

缺点:

第一:有一个"神奇的cookie"中.pyc.pyo.文件指示系统架构,蟒蛇文件是在编译如果你分发这些文件中的一个为不同类型的环境,这将打破.如果您分发.pyc.pyo不分配关联.py重新编译,或者touch它取代了.pyc或者.pyo,最终用户也无法修复它.

第二:如果docstrings使用-OO如上所述的命令行选项跳过,则没有人能够获得该信息,这可能使代码更难(或不可能).

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

sys.flags.optimize = 1

assert 语句被跳过

__debug__ =假

第四:如果你故意让你的python脚本#!/usr/bin/python在第一行的顺序上可执行,那么它就会被删除.pyc并且.pyo文件中的功能会丢失.

第五:有点明显,但是如果你编译你的代码,不仅可以影响它的使用,而且其他人从你的工作中学习的可能性会减少,而且往往是严重的.



4> UnkwnTech..:

运行已编译的python会有性能提升.但是,当您将.py文件作为导入的模块运行时,python将编译并存储它,并且只要.py文件不更改它将始终使用已编译的版本.

使用文件时使用任何交错语言,过程如下所示:
1.文件由interpeter处理.
2.编译文件
3.执行编译代码.

显然通过使用预编译的代码可以消除第2步,这适用于python,PHP等.

下面是一篇有趣的博客文章解释差异http://julipedia.blogspot.com/2004/07/compiled-vs-interpreted-languages.html
这里是一个解释Python编译过程的条目http://effbot.org/zone /python-compile.htm



5> Simon B. Jen..:

如前所述,将python代码编译为字节码可以提高性能.这通常由python本身处理,仅用于导入的脚本.

您可能想要编译python代码的另一个原因可能是保护您的知识产权不被复制和/或修改.

您可以在Python文档中阅读更多相关信息.


但是,正如Unkwntech所说的那样,如果这个人有足够的决心,那将永远是可能的.但我相信它在大多数情况下都足够了,你通常只想限制人们"修复"你的代码......
关于保护您的代码-编译不会有很大帮助。进行混淆处理-但是有意愿的人无论如何都会得到您的代码。

6> matpie..:

运行编译脚本时肯定存在性能差异.如果您运行普通.py脚本,则机器每次运行时都会编译它,这需要时间.在现代机器上,这几乎不引人注意,但随着脚本的增长,它可能会成为一个问题.



7> user258532..:

没有涉及到的是源到源编译。例如,nuitka将Python代码转换为C / C ++,并将其编译为直接在CPU上运行的二进制代码,而不是在较慢的虚拟机上运行的Python字节码。

这可以导致明显的加速,或者可以让您在环境依赖C / C ++代码的情况下使用Python。

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有