不同版本编译后的pyc文件是不同的,多出来两个pyc文件

亚洲城手机登录 1

Python代码的编译

我们在运行Python文件的过程中有时会多出来几个同名文件,但是文件后缀从.py变成了.pyc
。如下图有三个py文件,在start_here.py里import了common.py和unit.py 。


亚洲城手机登录 2

Python代码在解释执行之前,是会被编译成.pyc或者.pyo文件的,它们是中间字节码表示的文件,之后Python虚拟机才会去解释执行它们。

上面是还没运行前的三个.py文件,我们python start_亚洲城手机登录,here.py运行一下再看看:

 

亚洲城手机登录 3

1、pyc文件

运行后看上图,多出来两个pyc文件,分别是common.pyc和unit.pyc 。

=========

1.有没有好奇为什么会多出来两个.pyc文件?

pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte
code,py文件变成pyc文件后,加载的速度有所提高。

2.为什么start_here.py文件又没有pyc文件?

而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA或者.NET的虚拟机的概念。

接下来就来说清楚这个两个问题。

pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的。

这里啰嗦一下,我们都知道计算机是不认识你在代码里写的那一行行字母的,计算机只认二进制,也只执行二进制文件,我们写的代码是需要编译器编译成二进制的。

 

.pyc文件是干什么的

2、pyo文件

对于Python来说你写的Python代码在执行python
xxx.py时会由Python解析器翻译成PyCodeObject对象,俗称字节码(byte
code),然后交由Python虚拟机来执行字节码(PS:字节码才是可执行的)。

==========

在这个过程中这些字节码都是在内存中的,众所周知Python的运行性能不如编译性语言(比如C语言,JAVA
…),所以Python在程序执行结束后会把字节码写入到硬盘中,保存为.pyc文件,目的是下一次再执行python
xxx.py程序时,Python会先在目录下找xxx.pyc文件来执行,因为.pyc文件里保存的是字节码,所以就节省了Python解析器把xxx.py翻译成字节码的时间,所以就提高了性能。

pyo是优化编译后的程序 python -O
源文件即可将源程序编译为pyo文件。

总结就是.pyc文件是一个可执行的字节码文件,目的是节省Python解析器翻译时间,提高运行效率。其实性能只会提高那么一丢丢,大型项目.py文件很多的话,猿人学Python测试过节省的时间就多一点。

 

我们同样可以像执行py文件一样来执行pyc文件:

3、把单个文件编译成pyc

什么时候会生成.pyc文件

====================

第一次执行python程序后,被import的py文件会生成.pyc字节码文件,比如我的截图里举的例子,我在start_here.py文件里import了common.py和unit.py,执行程序后就生成了common.pyc和unit.pyc,没有生成start_here.pyc,因为它没有被import。

用如下代码

当第二次再执行程序时,Python就会拿.pyc文件和.py文件的修改时间对比,如果pyc文件修改时间大于py文件的话,说明py源文件没有被修改,Python就会直接执行.pyc文件;如果.py文件的修改时间比.pyc新的话,说明源文件被修改过,Python就会重新执行.py文件来重新生成字节码。

import py_compile

如果你想让所有py文件都生成pyc文件的话,可以执行:

py_compile.compile(r’H:\game\test.py’)

python -m compileall .

或者

别忘了compileall后面还有一个 . ,会把当前目录里py文件都生成pyc。

python -m py_compile test.py

其它pyc知识

这样会在test.py文件所在的目录下,生成一个__pycache__(注意:这里目录名前后有两个下划线)的目录,并且其中存有一个test.cpython-35.pyc文件,这个pyc文件就是test.py编译之后生成的文件。

其实我们安装的Python第三方库还是Python自带的包,都会在该目录下生成一个’__pycache__’目录,目录里全是该包的pyc文件,来看看。

 

亚洲城手机登录 4

4、把一个目录下所有python源文件编译pyc

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章