最近被这个问题困扰良久,在网上看了很多博客,总结一下:

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

初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在。如果是解释型语言,那么生成的*.pyc文件是什么呢?c应该是compiled的缩写才对啊!那到底怎么回事?

2.解释型语言和编译型语言

计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个“翻译机”来从事把高级语言转变成计算机能读懂的机器语言的过程。这个过程分成两类,第一种是编译,第二种是解释。

编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C语言。

解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby。

通过以上的例子,我们可以来总结一下解释型语言和编译型语言的优缺点,因为编译型语言在程序运行之前就已经对程序做出了“翻译”,所以在运行时就少掉了“翻译”的过程,所以效率比较高。但是我们也不能一概而论,一些解释型语言也可以通过解释器的优化来在对程序做出翻译时对整个程序做出优化,从而在效率上超过编译型语言。

此外,随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种。

用Java来举例,Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言。

再换成C#,C#首先是通过编译器将C#文件编译成IL文件,然后在通过CLR将IL文件编译成机器文件。所以我们说C#是一门纯编译语言,但是C#是一门需要二次编译的语言。同理也可等效运用到基于.NET平台上的其他语言。

3.Python到底是什么

其实Python和Java/C#一样,也是一门基于虚拟机的语言,我们先来从表面上简单地了解一下Python程序的运行过程吧。

当我们在命令行中输入python hello.py时,其实是激活了Python的“解释器”,告诉“解释器”:你要开始工作了。可是在“解释”之前,其实执行的第一项工作和Java一样,是编译。

熟悉Java的同学可以想一下我们在命令行中如何执行一个Java的程序:

javac hello.java

java hello

只是我们在用Eclipse之类的IDE时,将这两部给融合成了一部而已。其实Python也一样,当我们执行python hello.py时,他也一样执行了这么一个过程,所以我们应该这样来描述Python,Python是一门先编译后解释的语言。

4.简述Python的运行过程

在说这个问题之前,我们先来说两个概念,PyCodeObject和pyc文件。

我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器真正编译成的结果,也就是字节码。

当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。

当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。

所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式,即字节码,这点与JAVA是一样的。

若想优化生成字节码,应注意这两点:.pyc文件是由.py文件经过编译后生成的字节码文件,其加载速度相对于之前的.py文件有所提高,而且还可以实现源码隐藏,以及一定程度上的反编译。比如,Python3.3编译生成的.pyc文件,Python3.4就别想着去运行啦!→_→

.pyo文件也是优化(注意这两个字,便于后续的理解)编译后的程序(相比于.pyc文件更小),也可以提高加载速度。但对于嵌入式系统,它可将所需模块编译成.pyo文件以减少容量。

5.运行一段Python程序

我们来写一段程序实际运行一下:

然而我们在程序中并没有看到pyc文件,仍然是test.py孤零零地呆在那!

那么我们换一种写法,我们把print_str方法换到另外的一个python模块中:

这个时候pyc文件出现了,其实认真思考一下不难得到原因,我们考虑一下实际的业务情况。

6. pyc的目的是重用

回想本文的第二段在解释编译型语言和解释型语言的优缺点时,我说编译型语言的优点在于,我们可以在程序运行时不用解释,而直接利用已经“翻译”过的文件。也就是说,我们之所以要把py文件编译成pyc文件,最大的优点在于我们在运行程序时,不需要重新对该模块进行重新的解释。

所以,我们需要编译成pyc文件的应该是那些可以重用的模块,这于我们在设计软件类时是一样的目的。所以Python的解释器认为:只有import进来的模块,才是需要被重用的模块。

我们可以这样理解Python解释器的意图,Python解释器只把我们可能重用到的模块持久化成pyc文件。

7. pyc的过期时间

说完了pyc文件,可能有人会想到,每次Python的解释器都把模块给持久化成了pyc文件,那么当我的模块发生了改变的时候,是不是都要手动地把以前的pyc文件remove掉呢?

当然Python的设计者是不会犯这么白痴的错误的。而这个过程其实就取决于PyCodeObject是如何写入pyc文件中的。

我们来看一下import过程的源码吧:

不用仔细看代码,我们可以很清楚地看到原理,其实每次在载入之前都会先检查一下py文件和pyc文件保存的最后修改日期,如果不一致则重新生成一份pyc文件。

模块在每次导入前总会检查其字节码文件的修改时间是否与自身的一致。若是则直接从该字节码文件读取内容,否则源模块重新导入,并在最后生成同名文件覆盖当前已有的字节码,从而完成内容的更新(详见import.py)。这样,就避免了修改源代码后与本地字节码文件产生冲突。

8. 总结

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

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

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

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

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

Python是编译+解释型的语言,执行的时候是由Python解释器,逐行编译+解释,然后运行,因为在运行的过程中,需要编译+解释,所以Python的运行性能会低于编译型语言,比如C++。为了提高性能,Python解释器,会将模块(以后要重用的脚本文件放在模块里)的编译+解释的结果,保存在.pyc中。这样下次执行的时候,就省了编译这个环节。提高性能。一次性的脚本文件,解释器是不会保存编译+解释的结果,也就是没有.pyc文件。

转载:Python什么情况下会生成pyc文件?​www.zhihu.comhttps://www.cnblogs.com/kym/archive/2012/05/14/2498728.html​www.cnblogs.comPython程序的执行过程解释型语言和编译型语言_lujiandong1的专栏-CSDN博客_python源程序执行的方式边编译边执行​blog.csdn.net

再附一点对Java的解释:

为什么说Java的既是编译型又是解释型?

首先我们知道,在我们写完的Java代码的时候,生成出来的文件是的.java文件,这是Java的所特有的文件格式。看到这里你是不是在想那Java的就是解释型语言了。

JVM执行的.class文件的时候的确是一行一行边解释边执行下去的。但是,JVM使用了一种技术叫做JIT技术。眼熟是不是?

现在的JVM为了效率,都有一些JIT优化。它又会把的的.class的二进制代码编译为本地的代码直接运行。这种本地的代码又可以直接被系统运行。所以,它又是编译型的。这就是原因了。

python是一种编译语言_Python是编译型语言还是解释型语言?相关推荐

  1. 认识Python(python起源、设计、特点及编译型语言、解释型语言)

    学习目标: python的起源 为什么要用python python的特点 python的优缺点 1.python的起源 python的创始人为吉多.范罗苏姆 1989年圣诞节期间,吉多.范罗苏姆为了 ...

  2. python是一种编译语言_解释型语言和编译型语言的不同以及Python如何运行

    计划写关于Python中如何实现属性管理.函数(或类方法)管理.类管理的几篇成系列的文章. 而这篇文章写在这个系列之前,希望对后面几篇文章的理解有所帮助. 老实说,我也是在网上搜索了一些资料才写的这篇 ...

  3. python有几种模式_python的设计模式都有哪些?

    单例模式:Python 的单例模式最好不要借助类(在 Java 中借助类是因为 Java 所有代码都要写在类中),而是通过一个模块来实现.一个模块的模块内全局变量.模块内全局函数,组合起来就是一个单例 ...

  4. 用python的五种方式_Python加载数据的5种不同方式(收藏)

    数据是数据科学家的基础,因此了解许多加载数据进行分析的方法至关重要.在这里,我们将介绍五种Python数据输入技术,并提供代码示例供您参考. 作为初学者,您可能只知道一种使用p andas.read_ ...

  5. python的三种结构_Python控制结构,python

    比较运算符 布尔类型 布尔值有两个:True和False 例1: a = True a 例2: 2 == 3 提示: 1.不要把赋值(一个等号)与比较(两个等号)混淆. 2.Python是区分大小写的 ...

  6. python有几种容器_Python中几种内置的容器(Containers)类型:列表、字典、集合和元组的比较和该注意的点...

    之所以称他们为容器类型是因为他们不像基本类型那样只有一种简单类型的数据,而是可以包含其他类型的数据,numpy的计算速度比原生Python快的一个很重要的原因就是numpy中的数组(类似于Python ...

  7. python爬虫有多少种方式_python爬虫-----Python访问http的几种方式

    爬取页面数据,我们需要访问页面,发送http请求,以下内容就是Python发送请求的几种简单方式: 会使用到的库  urllib   requests 1.urlopen import urllib. ...

  8. 写出python中6种数据类型_Python数据类型(一)

    一.在Python中,基本数据类型主要可分为以下几种: 数字(Number): 字符串(String): 列表(List): 字典(Dictionary): 元组(Tuple): 1.在Python3 ...

  9. 用python的五种方式_Python模块重载的五种方法

    环境准备 新建一个 foo 文件夹,其下包含一个 bar.py 文件 $ tree foo foo └── bar.py 0 directories, 1 file bar.py 的内容非常简单,只写 ...

最新文章

  1. 8.6 GOF设计模式四: 策略模式… Strategy Pattern
  2. java基础知识总结,绝对经典
  3. Taro+react开发(5)--tora项目开发安装
  4. 威马汽车否认接盘ST众泰:没有任何兴趣参与
  5. 使用Elasticsearch,Kafka和Cassandra构建流式数据中心
  6. 2018年python工作好找吗-2018年最新数据:python、大数据、人工智能从业者薪资表...
  7. 【python工具】获取linux和windows系统指定接口的IP地址
  8. everedit选择_【EverEdit怎么用】EverEdit好不好_使用技巧-ZOL软件百科
  9. JLINK驱动刷新之WIN7
  10. 用例图、功能模块图和数据库的区别
  11. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day26】—— Spring框架3
  12. 前端:一篇彻底搞懂vuex中dispatch与commit的使用及差异
  13. 重装系统——最纯净的windows10系统安装方法
  14. GPRS使用AT指令发短信拨号
  15. 如何将鼠标和键盘连接到PlayStation 4
  16. 算法:十六进制最大数
  17. 高德地图-2D转换为3D
  18. E. Xenon's Attack on the Gangs,Codeforces Round #614 (Div. 2),树形dp
  19. [POI2005]Sza-Template
  20. 设置 Docker 开机自启动

热门文章

  1. wordpress-Ashade摄影作品展示相册 v2.0主题模板
  2. 2021.8.14-参加第四届全国青少年人工智能创新挑战赛C++全国决赛(二等奖)
  3. DEEP ACTIVE LEARNING FROM MULTISPECTRAL DATA THROUGHCROSS-MODALITY PREDICTION INCONSISTENCY 论文阅读
  4. 电商美工设计收藏,设计素材和灵感网站
  5. 【MindSpore】在训练过程中的step代表什么?
  6. 数据结构--带头结点的单链表
  7. 关于phpcms v9的404页面实现
  8. 计算机工勤技能考试试题,河南省事业单位工勤技能考试试题 (计算机信息处理)...
  9. 以太坊ENS域名注册量飙升216% 巨鲸疯狂扫荡?或将迎来炒作高潮
  10. pgAdmin的介绍 及使用