## Python详细谈论pyc
### 1. Python是解释器型语言?
听说过或正在学习python的学生相信听说过“python是说明语言”。 细心的学生应该会注意到*.pyc的文件。 这个文件是什么时候生成的,如何工作的呢?
今天让我们解开疑问。 如果您不太了解说明性语言和编译性语言,建议您先查看《编程基础——解释型语言和编译型语言》
# #2.运行" pythona.py "时发生了什么
在命令行中输入` ` ` Python a.py ` ` `实际上会激活python解释器,但在实际运行代码之前,必须运行代码解释器进程。
##3.在什么情况下生成pyc
####
* Python版本: 3.6
* Centos 7
#### print_hello.py
打印(iam ) __name_ ) )
打印(hello ) )。
#### import_hello.py
import print_hello
直接执行####脚本:不生成
[ root @ teach tmp ] # python print _ hello.py
I am __main__
你好
[root@teach tmp]# ls
import_hello.py print_hello.py
####模块导入:生成
[ root @ teach tmp ] # python import _ hello.py
I am print_hello
你好
[root@teach tmp]# ls
import _ hello.py print _ hello.py print _ hello.pyc
####注意
在windows上,python3下的pyc文件是在当前目录下生成的__pycache__目录
感兴趣的同学可以自己测试一下
### 4. pyc设计的目的
测试表明,只有将文件作为模块导入时才会生成pyc文件。 也就是说,Python解释器认为只有import执行的模块需要重用。
生成pyc文件的好处很明显,在多次运行程序时,不需要重新解释模块。
如果需要直接运行的print_hello.py文件也需要重复生成pyc文件,该怎么办? python提供了一种方法。
### 5. pyc的有效期限
* Python解释器将模块持久化为pyc文件,但如果模块发生更改该怎么办? 需要手动删除吗?
查看源代码后,可以得出以下结论
写入pyc文件时,写入了Long型变量。 变量的内容是文件的最后修改日期
*每次加载时,检查保存py和pyc文件的上次修改日期,如果不匹配,则重新生成pyc文件
### 6. Python的执行进程
#### PyCodeObject和pyc文件
* PyCodeObject是Python编译器实际编译的结果,并存储在内存中
* pyc文件是PyCodeObject的永久存储方法
####直接执行
* Python解释器解释一次脚本,并将结果保存到内存中的PyCodeObject中
*程序执行
####导入
导入Python程序后,首先在硬盘上搜索pyc文件
如果找到pyc文件并确认该文件是最新的,请继续使用
*如果找不到,或者py文件发生更改,请说明模块,将结果写回pyc文件后再使用
###一些启示
其实,了解Python程序的运行过程对大多数程序员,包括Python程序员来说意义不大。 那么,真正有意义的是,从Python解释器的做法中能学到什么,我认为有以下几点。
a .实际上,Python是否另存为pyc文件与设计缓存系统时相同。 仔细想想什么本来就值得扔到缓存里,什么才不值得扔到缓存里。
b .在运行耗时的Python脚本时,如何稍微缩短程序的运行时间是将模块与主模块断开连接。 (虽然这往往不是瓶颈)
c .在设计软件系统时,是否也应该将复用和非复用分开处理。 这是软件设计原则的重要部分。
d .在设计缓存系统(或其他系统)时,如何防止程序过期? 其实,Python的解释器也为我们提供了特别普遍有效的解决方案。
##参考
[博客园-飞林沙] 65http://www.cn blogs.com/xsd DM/archive/2012/05/14/2498728.html ]