为什么编译Python代码?

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

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

它被编译成字节码,可以使用得多,快得多。

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

Ben Blank的重要补充:

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

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

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

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

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

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

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

加号:

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

其次:如果编译的结果是一个小得多的文件,你将得到更快的加载时间。 很好的networking。

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

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

第五:只有.pyc.pyo文件的最终用户不太可能向您展示他们忘记告诉您的未恢复更改导致的错误。

第六:如果你的目标是一个embedded式系统,那么获得一个更小的文件来embedded可能是一个很大的优势,而且架构是稳定的,所以下面详细描述的缺点就不会起作用。

顶级编译

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

 python -m py_compile myscript.py 

这删除了评论。 它使docstrings保持完整。 如果你想摆脱docstrings (也许你想认真思考为什么你这样做),然后编译这种方式,而不是…

 python -OO -m py_compile myscript.py 

…你会得到一个.pyo文件而不是一个.pyc文件; 在代码的基本function方面同样是可分配的,但是由于被剥离的docstrings大小较小(并且如果首先具有体面的docstrings ,那么对后续的工作就不那么容易了解)。 但请参阅下面的缺点三。

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

缺点:

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

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

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

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

第四:如果你在第一行中有意使你的python脚本可执行文件的命令是#!/usr/bin/python ,那么在.pyc.pyo文件中将会删除这个脚本,并且这个function会丢失。

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

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

在使用文件时,使用任何interpeted语言,过程如下所示:
1.文件由插入者处理。
2.文件被编译
3.编译的代码被执行。

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

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

运行编译脚本时肯定会有性能差异。 如果您运行普通的.py脚本,机器每次运行都会编译它,这需要时间。 在现代机器上,这几乎不明显,但随着脚本的增长,它可能成为更多的问题。

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

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

你可以在Python文档中阅读更多。

我们使用编译后的代码来分发给无权访问源代码的用户。 基本上要停止没有经验的程序员不经意地改变某些东西或修正错误而不告诉我们。

是的,性能是主要原因,据我所知,唯一的原因。

如果你的某些文件没有被编译,也许Python不能写入.pyc文件,这可能是因为目录权限等原因。 或者,也许未编译的文件只是没有得到加载…(脚本/模块只在第一次被加载时被编译)

初学者认为Python是由于.pyc文件而编译的。 .pyc文件是编译的字节码,然后解释。 所以,如果你以前运行过你的Python代码并且方便的使用了.pyc文件,那么它将在第二次运行得更快,因为它不需要重新编译字节码

编译器:编译器是将高级语言翻译成机器语言的一段代码

口译员:口译员也将高级语言转换为机器可读的二进制等价物。 每次解释程序获得高级语言代码时,都会将代码转换为中间代码,然后再将代码转换为机器代码。 代码的每个部分都被解释,然后在一个序列中单独执行,并且在代码的一部分中发现错误,它将停止代码的解释,而不翻译下一组代码。

资料来源: http : //www.toptal.com/python/why-are-there-so-many-pythons http://www.engineersgarage.com/contribution/difference-between-compiler-and-interpreter