1.Python程序的执行过程
Python解释器(interpreter)在执行任何一个Python程序文件时,首先进行的动作都是先对文件中的Python源代码进行编译,编译的主要结果是产生的一组Python的字节码(byte code),然后将编译的结果交给Python虚拟机(Virtual Machine),由虚拟机按照顺序一条一条地执行字节码,从而完成对Python程序的执行动作。
对比java的执行:
java: .java-->(javac)-->.class-->(java)-->结果
python: .py -->(编译器)-->.pyc-->(虚拟机)-->结果
从上面可知:Python对源码的编译结果是产生的一个.pyc文件,这其实并不太准确。
如:
~/code/py/dis/demo.py
1 class A: 2 pass 3 def f(): 4 pass 5 a = A() 6 f()
执行:python demo.py,并没有产生.pyc文件。
分析如下:
对于Python编译器来说,PyCodeObject对象是其真正的编译结果,而pyc文件只是这个对象在硬盘上的表现形式。
在程序的运行期间,编译结果存在于内存的PyCodeObject对象中;而运行结束后,这个编译结果又被保存到pyc文件中。当下次运行相同的程序时,Python会根据pyc文件中记录的编译结果直接建立内存中PyCodeObject对象,而不用再次对源码进行编译了。
把py文件的编译结果保存到pyc文件,最大的优点在于在运行程序时,不需要对该源码重新进行编译。所以,需要编译形成pyc文的应该是那些可以重用的代码。
对于仅仅运行一次的程序,保存其对于的pyc文件时没有必要的。
如果程序要执行import导入模块的操作,程序运行时会触发pyc文件的生成(如果该模块在PATH路径下与之已有匹配的pyc文件,不需生成直接使用即可)
转载:https://www.cnblogs.com/fortwo/archive/2013/05/10/3071699.html