Python是一门解释型语言?

Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在。

如果是解释型语言,那么生成的*.pyc文件是什么呢?c应该是compiled的缩写才对啊!

为了防止其他学习Python的人也被这句话误解,那么我们就在文中来澄清下这个问题,并且把一些基础概念给理清。 python并非完全是解释性语言,它是有编译的,先把源码py文件编译成pyc或者pyo,然后由python的虚拟机执行,相对于py文件来说,编译成pyc和pyo本质上和py没有太大区别,只是对于这个模块的加载速度提高了,并没有提高代码的执行速度,通常情况下不用主动去编译pyc文件,文档上说只要调用了import model那么model.py就会先编译成pyc然后加载

解释型语言和编译型语言

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

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

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

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

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

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

Python到底是什么

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

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

简述Python的运行过程

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

我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器真正编译成的结果。我们先简单知道就可以了,继续向下看。

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

当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,先对.pyc文件和.py文件的最近一次的修改时间进行判断,如果.pyc文件的修改时间晚于.py文件,说明.py文件中的源代码未修改过,则直接载入,否则就重复上面的过程。

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

知识点补充:

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

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

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

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

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

到此这篇关于python属于解释语言吗的文章就介绍到这了,更多相关python是解释语言吗内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

python怎么解释语言_python属于解释语言吗相关推荐

  1. c语言实现爬虫功能,用C/C 扩展Python语言_python 调用c语言 python实现简单爬虫功能_python实现简单爬虫...

    用C/C 扩展Python语言 Python是一门功能强大的脚本语言,它的强大不仅表现在功能上,还表现在其扩展性上.她提供大量的API以方便程序员利用C/C++对Python进行扩展.因为执行速度慢几 ...

  2. python是c语言_python与c语言

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python语言调用c语言进行扩展,或者增加程序的运行速度都是特别方便的. 同时 ...

  3. c语言转换为python语言_python和c语言

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! c语言是编译型语言,经过编译后,生成机器码,然后再运行,执行速度快,不能跨平台, ...

  4. python怎么调用c语言_Python调用C语言程序方法解析

    Python调用C语言程序方法解析 首先我们需要将编写好的c程序文件编译为动态库文件(后缀名为.so) 使用下面的命令: gcc 原文件名.c -shared -o 新文件名.so 然后在python ...

  5. c语言python是什么意思_Python和C语言区别是什么?

    伴随着人工智能的发展,Python变得家喻户晓,成为当下最火的编程语言之一,而Python也是目前最简单易学的编程语言,现在不少新手入门IT行业都会选择Python.而对于刚刚接触Python的小白而 ...

  6. python语言是非开源语言_python是非开源语言吗

    python是非开源语言吗? python不是非开源语言,而是免费.开源的一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年 ...

  7. python ctypes 详解_python与C语言调用模块 ctypes的详解

    ctypes是python的一个函数库,提供和C语言兼容的数据类型,可以直接调用动态链接库中的导出函数. 为了使用ctypes,必须依次完成以下步骤: 加载动态链接库 将python对象转换成ctyp ...

  8. python是动态语言_Python是动态语言:动态添加或删除属性、方法

    Python是动态语言:动态编辑属性.动态编辑方法 1.运行过程中给对象绑定.删除属性 实例: class Person(): def __init__(self,name): self.name=n ...

  9. python是最好的语言_Python转Crystal语言或许是个不错的选择

    我自 2011 年起,就是 Python 的用户与爱好者了.当时,一个好友建议我用 Python 代替 Perl 试试 ,一个崭新的世界向我开放了.在这个世界里可读性比什么都重要,还有一种简明的规则. ...

最新文章

  1. wallpaper怎么改后缀_腾讯微信视频号怎么引流?腾讯视频号引流有哪些方法?
  2. 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)
  3. r 多元有序logistic回归_R语言多元Logistic逻辑回归 应用案例
  4. C++ STL lower_bound,upper_bound的使用总结
  5. boost::gil模块沿 x 轴计算梯度的方法的示例
  6. .NET Core 下使用 RabbitMQ
  7. EL表达式的11隐含对象
  8. 开源贡献 计算_学生如何开始为开源软件做贡献
  9. MVC4发布到IIS,出现HTTP 错误 404.0 - Not Found的解决方法
  10. python打开文件注意事项_Python 中关于文件操作的注意事项
  11. 为什么重写equals方法时,要求必须重写hashCode方法?
  12. 2019蓝桥:2019拆分为平方和问题
  13. openwrt下使用wget出现Failed to allocate uclient context
  14. 树莓派无法打开摄像头模块,无法识别摄像头
  15. 安卓 Handler 机制学习
  16. IPSAN与FCSAN存储结构的区别
  17. 推荐一个维基百科的中文镜像网站
  18. 【Selenium】Selenium的3种等待方式
  19. 谷歌:民主国家搜索引擎的消费监控
  20. 【MySql】简明笔记

热门文章

  1. 岗位内推 | 腾讯云小微自然语言技术中心招聘NLP研究型实习生
  2. 第七期 | 90天带学《机器学习》西瓜书+带打天池和达观杯AI大赛
  3. inodesusedpercent_Linux运维监控基础采集项
  4. Nexus【环境搭建 02】最新版本 nexus-3.35.0-02-unix.tar.gz 安装配置启动及测试(JDK版本+虚拟机参数配置说明)
  5. hibernate原理
  6. SpringMVC获取请求参数-基本类型
  7. Struts2-值栈的定义
  8. java修改字节码技术,Javassist修改class,ASM修改class
  9. vue实现时间选择器,精确到秒
  10. Java实现查询菜单返回树结构