## Python细说pyc

### 1. Python是一门解释型语言?

相信听说过或在学python的同学都听说过“Python是一门解释性语言”,如果细心的同学,应该会留意到*.pyc的文件,这个文件是什么时候生成的,它究竟有什么作用呢?

今天就来帮大家解解疑惑,如果大家对解释型语言和编译型语言不太明白的,建议先看看《编程基础——解释型语言和编译型语言》

### 2. 执行“python a.py”时发生了什么

当我们在命令行输入```python a.py```时,实际上是激活了Python的解释器,然而在真正运行代码前,它还是需要对代码进行一次解释过程。

### 3. 什么情况下会生成pyc

#### 环境说明

* Python版本:3.6

* Centos 7

#### print_hello.py

print("I am "+__name__)

print('hello')

#### import_hello.py

import print_hello

#### 直接运行脚本:不生成

[root@teach tmp]# python print_hello.py

I am __main__

hello

[root@teach tmp]# ls

import_hello.py print_hello.py

#### 模块导入:生成

[root@teach tmp]# python import_hello.py

I am print_hello

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中

* 程序运行

#### import导入

* 当Python程序被导入时,会先在硬盘中寻找pyc文件

* 若找到pyc文件,并确认文件为最新,则直接使用

* 若未找到或py文件做过修改,则先对模块进行解释,并将结果写回到pyc文件中,然后使用

### 一些启示

其实了解Python程序的执行过程对于大部分程序员,包括Python程序员来说意义都是不大的,那么真正有意义的是,我们可以从Python的解释器的做法上学到什么,我认为有这样的几点:

A. 其实Python是否保存成pyc文件和我们在设计缓存系统时是一样的,我们可以仔细想想,到底什么是值得扔在缓存里的,什么是不值得扔在缓存里的。

B. 在跑一个耗时的Python脚本时,我们如何能够稍微压榨一些程序的运行时间,就是将模块从主模块分开。(虽然往往这都不是瓶颈)

C. 在设计一个软件系统时,重用和非重用的东西是不是也应该分开来对待,这是软件设计原则的重要部分。

D. 在设计缓存系统(或者其他系统)时,我们如何来避免程序的过期,其实Python的解释器也为我们提供了一个特别常见而且有效的解决方案。

### 参考

[博客园-飞林沙](http://www.cnblogs.com/kym/archive/2012/05/14/2498728.html)

python运行pyc文件_Python中你不知道的pyc文件相关推荐

  1. python 写txt 换行_python中写入txt文件需要换行,以及\r 和\n

    在Python中,用open()函数打开一个txt文件,写入一行数据之后需要一个换行 如果直接用 f.write('\n') 只会在后面打印一个字符串'\n',而不是换行' 需要用 f.write(' ...

  2. python中with open写csv文件_Python中的CSV文件使用with语句的方式详解

    是否可以直接使用with语句与CSV文件?能够做这样的事情似乎很自然: import csv with csv.reader(open("myfile.csv")) as read ...

  3. python db文件_python中查看.db文件中表格的名字及表格中的字段操作

    1.问题描述: 我桌面上有一个"账号密码.db"文件,我现在想知道里面有几张表格table.表格的名字.表头结构. 2.使用SQL语句"""selec ...

  4. python modbus类封装_Python 中引入一个文件,模块的概念

    Python 提供了强大的模块支持,主要体现在,不仅 Python 标准库中包含了大量的模块(称为标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块. 通过这些强大的模块可以极大地提高开 ...

  5. python判断最后一行_python中如何判断文件的最后一行是空行?

    问题: 前两天遇到一个问题,比如dat和bcp文件的格式需要最后一行一定是空行.但是用python怎么也不能读到最后一行的空行. test1: file_obj = open(file_name) a ...

  6. python处理nc数据_python中的.nc文件处理 | 04 利用矢量边界提取NC数据

    利用矢量边界提取.nc数据 import os import numpy as np import pandas as pd import matplotlib.pyplot as plt impor ...

  7. python找到文件夹下指定文件类型_python 读取指定文件夹中的指定文件类型的文件名...

    C# 读取指定文件夹中的全部文件,并按规则生成SQL语句! 本实例的目的在于: 1 了解怎样遍历指定文件夹中的全部文件 2 控制台怎样输入和输出数据 代码: using System; using S ...

  8. python算法和数据结构_Python中的数据结构和算法

    python算法和数据结构 To 至 Leonardo da Vinci 达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this ar ...

  9. python打不开xls文件,wps下用vba实现合并文件夹中所有excel文件

    python打不开xls文件,用wps下vba解决问题 用了常用的三种python读写xls文件的方法都报错 xlrd openpyxl pandas 原因 解决方法 用vba实现合并文件夹中所有ex ...

最新文章

  1. druid.io mysql 配置_druid.io 使用mysql存储metadata overlord启动出错
  2. 实验 4 [bx]和 loop 的使用
  3. springcloud-05-ribbon中不使用eureka
  4. 【英语学习】【WOTD】sentient 释义/词源/示例
  5. cacti气象图调整(批量位置调整、更改生成图大小等)
  6. WCF服务重构实录(中)
  7. XenCenter创建VM过程
  8. 代码该怎么写——设计原则
  9. 2023最新猕猴桃影视系统源码/影视APP源码+安卓/苹果双端
  10. 【图像识别】基于模板匹配算法求解车牌识别问题matlab代码含GUI界面
  11. SpringBoot使用EasyExcel 模板填充数据并导出,以及Excel导入解析入库
  12. windows 操作系统安全运维所考虑的安全基线内容
  13. linux下僵尸进程(<defunct>进程)的产生与避免
  14. LaTeX的入门使用(新手使用向)
  15. 《从你的全世界路过》之稻城
  16. HTML网页设计:周杰伦网站
  17. 「分布式架构」最终一致性:反熵
  18. NX二次开发-NXOPEN C# Part.GetPreviewImage读取prt文件预览图
  19. 网络安全行业需要工匠精神吗?
  20. BIM软件 Bentley OpenRoads Designer道路设计软件功能

热门文章

  1. chgrp linux,linux命令chgrp
  2. MySQL简介和基本使用
  3. springboot集成rabbitmq:fanout、topic
  4. PDF输出和word转PDF输出
  5. js实现常用排序算法
  6. axivion和astree_CALLIVION
  7. 图形学相关期刊和会议的基本信息
  8. vue动态路由传参的几种方式
  9. php代码覆盖工具 -- PHPCodeCoverage
  10. Javascript+Ajax+Node JS +socket .io +mysql 实现在线私人聊天