[有趣的Python 7] 解释?还是编译?That is the question

[有趣的Python 7] 解释?还是编译?That is the question

Python是一个解释型的语言。但是为了效率上的考虑,Python也提供了编译的方法。编译之后是bytecode的形式。Python也提供了和Java类似的VM来执行这样的bytecode。不同的是,因为Python是一个解释型的语言,所以编译(compile)不是一个强制的操作。事实上,编译是一个自动的过程。多数情况下,你甚至不会在意他的存在。编译成bytecode可以节省加载模块的时间,从而提高效率

通常,自动的编译过程发生在对模块(module)的调用过程中。我们在查看python提供的标准类库的时候可以看到很多的.pyc文件,用file命令查看一下,发现类型是“data”,也就是二进制文件。我们做个实验,写个自己的module,然后看看他是如何编译的。关于模块的知识我们这里先不深入,以后有机会再谈。

OK,我们先写个自己的模块。文件名就叫做testM.py

[Copy to clipboard] [ - ]
CODE:
#! /usr/bin/py  thon

"""testM.py"""
class MyClass:
    i = 1.2
    def f(self):
        return 'hello'
    def __init__(self):
        self.a = 'A'

if __name__ == '__main__':
    x = MyClass
    print x.i

其实模块(module)这个词没有什么神秘的。随便一个python文件,只要你愿意把他共享出来,它就是一个模块。

我们再写一个测试用的代码,testU.py

[Copy to clipboard] [ - ]
CODE:
#! /usr/bin/python

import test

x = test.MyClass()
x.j = 123
print x.a
y = test.MyClass()
y.a = 'Y'
print y.a
print x.a
print x.j

我们可以看到模块名就是模块所在的文件名。现在我们执行一下testU.py。然后再查看一下当前目录。Aha!一个新文件:testM.pyc出现了。是一个二进制的文件。自动编译发生了。每次当我们更新了.py文件之后,.pyc文件也会对应的更新。

除了效率原因,bytecode也增加了反向工程的难度,在某种程度上保护你的代码。当然,反编译仍然是可以的。所以如果真的想保护代码,还是用别的方法吧。

另外Python还提供了-O选项,可以编译生成“优化”的bytecode,文件扩展名是.pyo。但实际上优化的内容有限,作用不大。

如果希望生成可执行文件,就要依赖于第三方的工具了。
为啥是python 7

现在最高的版本才是2.4啊。


QUOTE:
原帖由 "sleetdrop" 发表:
为啥是python 7

现在最高的版本才是2.4啊。

这个是sakulagi系列文章的第7篇,不是Python的版本,呵呵
.pyc是中间代码,类似java和.net的中间代码.
可以让python的虚拟机装载中间代码运行,py2exe的工作原理与此类似.
你可以将用py2exe生成的zip文件打开,可以看到里面有pyc文件.
当然是解释运行,不过生成的字节码倒挺有趣的.因为解释运行,所以源码开放,所以他成为是开源中的中流抵柱.