对于python文件,敲下回车后发生了什么

news2024/11/19 20:42:57

引言

我们常说 Python 一是门解释型语言,只需要敲下 python code.py就可以运行编写的代码,而无需使用类似于 javac 或者 gcc 进行编译。那么,Python 解释器是真的一行一行读取 Python 源代码而后执行吗? 实际上,Python 在执行程序时和 Java、C# 一样,都是先将源码进行编译生成字节码,然后由虚拟机进行执行,只不过 Python 解释器把这两步合二为一了而已。

事实上,Python 程序在执行过程中同样需要编译(Compile),编译产生的结果称之为字节码,而后由 Python 虚拟机逐行地执行这些字节码。所以,Python 解释器由两部分组成: 编译器和虚拟机。

https://smartkeyerror.com/Python-Virtual-Machine

上图展示了 Python 程序的执行过程,以及C程序的编译、汇编与链接过程,从该图中可以非常明显地看出 Python 与 C 程序的执行区别。Python 如此设计的原因在于将程序的执行与底层硬件进一步地分离,无需担心程序的编译、汇编以及链接过程,使得 Python 程序相较于 C 程序而言更加易于移植。

一、python解释器是什么

1. 解释性语言和编译性语言

计算机看不懂解释性语言和编译性语言的源代码,计算机只认识二进制指令。所以,想让程序被执行,那么自然要先把源代码转化为二进制指令,也就是机器码(最后有解释)。

那么,在什么时候进行转换呢?

  • 有的语言要求必须提前把代码一次性转换完毕,这种就是编译型语言,用的转换工具就叫编译器,比如C语言、C++。
  • 有的语言则可以一边执行一边转化,用到哪里了就转哪里,这种就是解释性语言,用的转化工具叫解释器,比如python、javascript。
  • java比较特殊,既有编译又有解释。但是编译并没有直接编译成机器码,而是编译成字节码,然后再拿到虚拟机中执行。这种设计初衷是在跨平台的同时兼顾执行效率,这里就不展开了。

2. python解释器

python解释器是一种让其他程序运行起来的程序,编写的python代码必须在解释器中运行,这东东已经在我们安装python的时候都装上了。
所以,现在我print(hello world),就可以运行了,控制台可以看到文本的输出。

3. python程序运行过程

上面的一行代码虽然简单,但是python运行它还是经过了两步操作:

  • 将源代码编译成为“字节码”
  • 转发“字节码”到“虚拟机”

字节码编译

可以理解为翻译,把print(hello world)翻译成字节码,字节码会保存在后缀名是.pyc的文件里,这文件其实就是编译后的.py源代码。

这些字节码相较于源代码,运行起来速度要快得多。为什么?

  • 因为在下一次运行程序时,如果在上次保存了字节码之后没有修改过源代码了,Python就会加载.pyc文件并且跳过编译这个步骤。
  • 当必须要重新编译时,python会自动检查源文件和字节码文件的时间戳,如果你又保存了源代码,下次程序运行时,字节码将自动重新创建。
    在这里插入图片描述

python虚拟机

Python Virtual Machine,简写为PVM,当有字节码文件之后,就会被发送到PVM里来执行。

这里注意,PVM并不是指的一个独立的程序,是不需要安装的。可以把PVM理解为Python的运行引擎,是一个迭代运行字节码指令的大循环,一个个的完成操作,直到结束。

从技术角度看,PVM才是“解释器”的最后一步。
在这里插入图片描述

二、关于python的性能

大家都知道,python的缺点是运行慢。但其实这里的慢也只是相对而言,跟C和C++这类编译性语言相比,确实执行速度还不够快。

为什么?

上述也提到了python会把源代码转成字节码,然后再将字节码解释出来。但是为了更好的跨平台性,这里的字节码是一种跟平台无关的格式,所以并不是底层的二进制代码。到目前为止,只要不是对运行速度有严苛要求的领域,比如数值计算或动画这种,经常需要核心处理单元至少以C语言的速度执行,绝大多数的应用,python还是可以胜任的。

相比于缺点,python带来开发效率的提升,还有python良好的生态,相信也是很多人喜爱的的重要因素。

机器码和字节码

机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据。

通常意义上来理解的话,机器码就是计算机可以直接执行,并且执行速度最快的代码。

用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义。手编程序时,程序员得自己处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。这是一件十分繁琐的工作,编写程序花费的时间往往是实际运行时间的几十倍或几百倍。而且,编出的程序全是些0和1的指令代码,直观性差,还容易出错。现在,除了计算机生产厂家的专业人员外,绝大多数的程序员已经不再去学习机器语言了。

  • 机器语言是微处理器理解和使用的,用于控制它的操作二进制代码。
  • 8086到Pentium的机器语言指令长度可以从1字节到13字节。
  • 尽管机器语言好像是很复杂的,然而它是有规律的。
  • 存在着多至100000种机器语言的指令。这意味着不能把这些种类全部列出来。

总结:机器码是电脑CPU直接读取运行的机器指令,运行速度最快,但是非常晦涩难懂,也比较难编写,一般从业人员接触不到。

字节码(Bytecode)是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件。

字节码主要为了实现特定软件运行和软件环境、与硬件环境无关。字节码的实现方式是通过编译器和虚拟机器。编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令。字节码的典型应用为Java bytecode。

  • 字节码在运行时通过JVM(JAVA虚拟机)做一次转换生成机器指令,因此能够更好的跨平台运行。
  • 字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码。
  • 通常情况下它是已经经过编译,但与特定机器码无关。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。

总结:字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/454861.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么要进行倾斜摄影三维模型的顶层合并?

为什么要进行倾斜摄影三维模型的顶层合并? 1、倾斜摄影三维模型顶层合并的重要性 倾斜摄影三维模型的顶层合并是指将拍摄同一区域的多个倾斜角度的影像进行融合,生成一个连续的、完整的三维地理信息数据。其原因主要有以下几点: &#xff0…

关于倾斜摄影三维模型轻量化数据大小和质量关系分析

关于倾斜摄影三维模型轻量化数据大小和质量关系分析 倾斜摄影三维模型轻量化是一种常用的技术,通过对原始三维模型数据进行压缩和简化,减小其数据大小,从而提高数据传输和展示效率。然而,轻量化过程中可能会对数据质量产生影响。以…

性能测试——安装Loadrunner11.0的详细步骤

一、下载Loadrunner11.0版本 去相关网站下载即可 二、安装 (windows与虚拟机上安装操作大相径庭) 1、将ISO文件导入,打开光驱,运行“setup.exe“ 2、点击安装,部分机器会提示缺少“Microsoft Visual C 2005 SP1运行组…

有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 来源:力扣(LeetCode) 链接:https://leetco…

Java 将json中key值中带有下划线的部分转为驼峰格式

一、背景说明 在开发过程中,有时会遇到第三方厂商提供的接口返回结果不是严格按照驼峰命名,需要将其中带有下划线的字段进行格式化转换为驼峰命名。 如下图中的self_auth、user_id、user_name、creator_name 和 others_auths 等 key 值。 如果是对 JS…

Mysql 45讲和45问笔记(未完待续0203/04/24)

一、mysql 45讲 1)索引的本质讲解 定义解释 所以是帮助Mysql高效获取数据的排好序的数据结构 索引数据结构 ①二叉树 ②红黑树 ③Hash表 ④B-Tree 原理讲解 可以看到右边的数据结构里面,是按照k-v来存数据结构的,key是col2的字段&#xf…

【Linux】线程-线程概念

线程概念 什么是线程线程的优点和缺点线程的用途和线程异常线程与进程的区别 什么是线程 实际上,线程是一个进程内部的控制序列,一个程序的一个执行线路就是一个线程。 并且一个进程中至少有一个线程,本质上,一个进程内部如果有多…

6. 树的入门

6. 树的入门 之前我们实现的符号表中,不难看出,符号表的增删查操作,随着元素个数N的增多,其耗时也是线性增多的,时间复杂度都是O(n),为了提高运算效率,接下来我们学习树这种数据结构。 6.1 树的基本定义 …

MybatisPlus-入门项目搭建、SQL日志打印、实体类注解、简单持久层操作

Mybatis-Plus mybatis plus概述 ​ Mybatis Plus (opens new window)简称 MP,它是一个MyBatis 的增加工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 Mybatis Plus官网:https://…

拉格朗日函数对偶问题、KKT条件

一、概念介绍 KKT最优化条件是Karush(1939)以及Kuhn和Tucker(1951)先后独立发表出来的,但在Kuhn和Tucker发表之后才逐渐受到重视,因此多数情况下记载成库恩-塔克条件(Kuhn-Tucker conditions)。先介绍几个优化的概念。 1.1 优化 最优化问题&#xff0…

大彩串口屏新品发布:大彩7寸新品RS485/232双通讯口人机界面发布!

一、产品介绍 新品发布:大彩7寸新品RS485/232双通讯口人机界面发布! 此次发布7.0寸外壳HMI产品采用普清800*480液晶屏、触摸选用电阻触摸,硬件性能上与M型医用级组态串口屏一样,软件上拥有炫酷的动画效果,页面切换流…

路侧激光雷达目标检测系统-篇2

本篇文章承接上文,主要阐述代码,分布的成果等工作。识别结果为单帧图片,每一张图片识别完之后,放在一起,就可以连续播放单帧文件,变成视频,或者直接在matlab图窗里面播放。关于这个函数的功能我…

HTML+CSS+JS 学习笔记(三)———Javascript(中)

🌱博客主页:大寄一场. 🌱系列专栏:前端 🌱往期回顾:HTMLCSSJS 学习笔记(三)———Javascript(上) 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 目录 JavaScrip…

NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_统计语言模型的平滑策略---人工智能工作笔记0035

https://www.cnblogs.com/nickchen121/p/16470569.html#tid-458p3Y 参考这个文档学习 条件概率的链式法则:这个是需要去补充的知识. 首先我们来看一下上一节说到的预训练,可以看到,我们比如有个鹅鸭的分类问题, 这个鹅鸭分类我们是用10万张图片训练的模型,这个已经可以把这个…

3. 马氏决策过程

3. 马氏决策过程 3. 马氏决策过程3.1 马氏过程3.2 马氏奖励过程3.3 马氏决策过程3.4 贝尔曼方程与最优值 3. 马氏决策过程 3.1 马氏过程 3.2 马氏奖励过程 3.3 马氏决策过程 3.4 贝尔曼方程与最优值

如何从有故障的 SD 卡恢复文件

如何从损坏的 SD 卡中恢复文件? 您是否正在与损坏的 SD 卡作斗争?您的 SD 卡上是否有您无法承受的数据丢失,但它没有响应?好吧,我们为您解决了! SD 卡是智能手机、相机和笔记本电脑中常用的存储设备。虽然…

2. 多臂老虎机问题

多臂老虎机问题 2. 多臂老虎机问题2.1 强化学习基本概念2.2 多臂老虎机与regret值2.3 随机多臂老虎机2.4 对抗多臂老虎机2.5 上下文多臂老虎机2. 多臂老虎机问题 2.1 强化学习基本概念 2.2 多臂老虎机与regret值

SpringCloud入门实战(七)-Hystrix入门简介

📝 学技术、更要掌握学习的方法,一起学习,让进步发生 👩🏻 作者:一只IT攻城狮 。 💐学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看&…

图像基本运算

图像基本运算 图像算数运算: 1)图像加法 示例代码: import cv2 import numpy as np img1 cv2.imread(‘…/datas/fengjing1.png’)#(546, 820, 3) img2 cv2.imread(‘…/datas/logo.png’)#(512, 512, 3) print(img1.shape) img1resize cv2.resize(img1, (24…

4.微服务项目实战---Sentinel--服务容错

4.1 高并发带来的问题 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络 原因或者自身的原因,服务并不能保证服务的 100% 可用,如果单个服务出现问题,调用这个服务…