python怎么让py里面逐行运行_Python中的.pyc文件是干什么的呢?

e8b6f64e87ac596bdf1668d674862fc3.png

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

a3acb53288dd3af1cd509a3e79ce86a9.png

上面是还没运行前的三个.py文件,我们python start_here.py运行一下再看看:

d3d4d3094bc9d34bee10d87a569e373e.png

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

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

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

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

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

.pyc文件是干什么的

对于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翻译成字节码的时间,所以就提高了性能。

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

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

9c55465146c76d529b32a42737004672.png

什么时候会生成.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文件来重新生成字节码。

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

python -m compileall .

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

其它pyc知识

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

82fa2cbeae587a045610200688285751.png

python3.5之后只要你的目录里有__main__.py这个文件,运行命令

python dir(具体的python目录),就会在该dir下生成__pycache__目录,里面是该dir里的pyc文件。

另外提供一个骚操作,因为pyc文件是字节码,是二进制文件,所以反编译出源代码是比较麻烦的,所以如果是项目交付性质,不想交源代码的话,可以把pyc文件给对方。只是一个想法,没有实践过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值