您的位置:首页 > 编程语言 > Python开发

Python FAQ2-python代码编译问题

2015-01-23 14:43 197 查看
本篇是关于py2.7.9-docs的FAQ.pdf中关于python编译的问题“3.13 Can Python be compiled to machine code, C or some other language?”

python不容易被转化为机器码。几个项目可以证明,它可以转换为机器码,但速度仅提高很少(2倍)。
在内部,python源代码总是被转换成字节码,然后通过python虚拟机去执行。为了避免重复地解析和转换很少改变的模块,这种字节码被写到了一个.pyc文件。该pyc文件只有在对应的py文件改变后,才会重新的进行解析py文件并转换成字节码。
pyc文件被加载后,执行它的字节码和执行py文件明码没有性能差异。唯一的区别是加载(import) pyc文件快于加载py文件(因为还要解析并转换为字节码)。
也就是说,预编译版本.pyc文件的存在改善了Python脚本的启动时间,不影响运行时间。如果愿意可以手工使用compileall模块将py文件转换为pyc文件。
注意,python执行的主程序脚本不会被(自动)转换到pyc文件。主程序脚本也同样会被转换为字节码,但是不会存储在pyc文件中。主程序(启动文件)运行,会加载(import)其他的模块,这时其他的模块所在路径下会自动生成对应名称的pyc文件,但是该启动文件不会生成pyc。究其原因,大概是主模块一般不会被其他模块导入,pyc文件的优势(被导入时速度快)不会凸显出来。而且相对较小,即使被导入,也不会造成大的速度消耗。
下面是手工测试的一个场景:
同一个目录下创建两个文件,file1.py file2.py,并且在file2中导入file1

#file1.py
#coding:utf-8
a = 5

#file2.py
#coding:utf-8
import file1
下面运行file2后,发现该目录下多出了一个file1.pyc文件。
再次运行file2后,发现file1.pyc文件的修改时间是没有变化的。
修改file1.py文件,比如将a = 5改成 a = 6,保存后运行file2,发现file1.pyc的修改时间变化了

上面的实例即证明了上述的说法,下面简单使用下compileall模块:
我们进入cmd,转入上面实例代码所在的目录,然后进入python解释器,执行:
In [1]: import compileall

In [2]: compileall.compile_
compileall.compile_dir  compileall.compile_file compileall.compile_path

In [2]: compileall.compile_file('file2.py')
Compiling file2.py ...
Out[2]: 1

In [3]: compileall.compile_dir('./')
Listing ./ ...
Compiling ./file1.py ...
Out[3]: 1

In [4]:


本文出自 “无名” 博客,请务必保留此出处http://xdzw608.blog.51cto.com/4812210/1607397
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: