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
再次运行file2后,发现file1.pyc文件的修改时间是没有变化的。
修改file1.py文件,比如将a = 5改成 a = 6,保存后运行file2,发现file1.pyc的修改时间变化了
上面的实例即证明了上述的说法,下面简单使用下compileall模块:
我们进入cmd,转入上面实例代码所在的目录,然后进入python解释器,执行:
本文出自 “无名” 博客,请务必保留此出处http://xdzw608.blog.51cto.com/4812210/1607397
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
相关文章推荐
- 关于python使用pyrex编译成可执行文件的问题
- 编译python模块要求安装vs2003问题的Hack解决办法
- DEVExpress9.3源代码编译问题整理
- 使用ubuntu x86_64位元编译Android代码遇到的library问题(solved)
- 不安全代码只会在使用/unsafe编译的情况下出现 .net问题
- FootStep 8、VC6下进行Symbian开发时,非代码问题引起的编译及链接出错的解决方法
- 编译LDD第三版中scullc代码时遇到的问题及解决方法
- 《Unix网络编程(第3版)》代码编译的一些问题
- 《Unix网络编程(第3版)》代码编译的一些问题
- [转]Java代码的静态编译和动态编译中的问题比较
- 编译.net代码和加密代码的问题
- Linux Device Driver 3 中的代码在 2.6.27 中编译不能通过的问题
- 用python写成的排列问题求解代码
- 代码从VS2003升级到VS2005的编译链接问题及解决方法
- C++代码中嵌入Python之后程序的发布问题
- python代码(4) ---兔子毒药问题
- 用VIM写Python代码缩进问题
- 关于圣二源代码编译问题解决
- 求平衡点问题的C#代码(python面试题转换)
- 编译python代码方法