Python入门

Python 是一种解释型语言,这意味着它的执行方式与编译型语言如 C 或 Java 有所不同。但这并不意味着 Python 没有编译过程。事实上,Python 先将源代码编译为字节码,然后解释或执行这些字节码。以下是 Python 的编译和执行过程的详细步骤:

  1. 源代码 (.py 文件):
    你的 Python 程序开始作为一个简单的文本文件,其中包含 Python 源代码。

  2. 编译过程:
    当你尝试运行 Python 程序时,Python 编译器会首先将其转换为 Python 字节码。这一步是由 Python 的内部编译器 PyCompiler 完成的。

  3. 字节码 (.pyc 文件):
    字节码是一种低级、与平台无关的表示形式,它更接近于机器代码。字节码文件被存储在 __pycache__ 目录下,通常为 .pyc 扩展名。这些字节码可以被 Python 解释器直接使用,从而快速执行,而不需要重新从源代码编译。

    值得注意的是,.pyc 文件并不是严格必要的。它只是加速了程序的启动,因为重新从源代码生成字节码需要时间。

  4. Python 虚拟机 (PVM):
    一旦生成了字节码,Python 虚拟机 (PVM, Python Virtual Machine) 便开始解释并执行这些字节码。PVM 通常不是一个独立的程序,而是 Python 解释器的一部分。它负责执行编译后的字节码。

  5. 执行:
    在 PVM 内,字节码被一条一条地执行。这意味着字节码被逐条解释并执行,而不是被翻译成机器代码。

总结,Python 的运行流程包括两个主要阶段:编译阶段和解释阶段。在编译阶段,源代码被转换为字节码;在解释阶段,字节码在 Python 虚拟机中被执行。这种方式结合了编译型语言的一些优点(如预处理的错误检查和某些优化)和解释型语言的灵活性与跨平台能力。

Python 字节码

为了了解 Python 字节码,首先我们可以创建一个简单的 Python 函数,并使用内置的 dis 模块来查看其字节码表示。以下是如何做到这一点的示例。

首先,让我们定义一个简单的 Python 函数:

def add(a, b):result = a + breturn result

接着,我们使用 dis 模块来反汇编该函数,以查看其字节码表示:

import disdis.dis(add)

执行上述代码可能会产生以下输出(取决于你使用的 Python 版本):

  2           0 LOAD_FAST                0 (a)2 LOAD_FAST                1 (b)4 BINARY_ADD6 STORE_FAST               2 (result)3           8 LOAD_FAST                2 (result)10 RETURN_VALUE

这里是对字节码的解读:

  • LOAD_FAST:将一个局部变量(例如 ab)加载到堆栈上。0 (a) 表示局部变量的索引,以及该变量的名称。
  • BINARY_ADD:从堆栈中弹出两个值,将它们相加,然后将结果压回堆栈。
  • STORE_FAST:将堆栈顶部的值存储到局部变量中(这里是 result)。
  • RETURN_VALUE:从堆栈中弹出一个值并将其返回。

① 每个指令通常都有一个与之关联的操作数,这在这里是括号中的值(例如 0 (a))。此值为指令提供额外的上下文,例如要加载或存储的特定变量。

② 在这个字节码输出中,前面的 23 是源代码的行号。这些行号对应于 Python 源代码中生成这些特定字节码的位置。

这样的输出设计有助于开发者理解哪一行源代码对应于哪些字节码指令,从而在调试或分析时更容易定位问题。

在提供的字节码中:

  • 行号 2 对应于源代码中定义 result 的行,即 result = a + b
  • 行号 3 对应于源代码中的返回语句,即 return result

总之,这些行号是为了帮助你将字节码指令与其在原始 Python 源代码中的位置联系起来。

③ 前面的 0, 2, 4, 6, 8, 10 是字节码指令的偏移量(offsets)。在字节码序列中,每个指令都有一个相应的偏移量,表示该指令从字节码序列开始的字节距离。

为什么有些偏移量会跳过一个数字,如从 02 而不是 1?这是因为不同的字节码指令以及它们的参数可能需要不同数量的字节。LOAD_FAST 指令本身占用一个字节,它的参数(例如 0 (a))占用另一个字节,总共两个字节。因此,LOAD_FAST 0 (a) 占用两个字节,从偏移量 0 开始,所以下一个指令的偏移量是 2

这些偏移量在调试、跟踪和分析字节码时很有用,尤其是当你需要理解控制流如何跳转到特定的指令时(例如在循环或条件分支中)。

这个例子为我们提供了一个简单的 Python 函数的字节码表示的概览。实际上,Python 字节码包含许多其他指令,它们用于实现更复杂的操作和控制流结构。

Python 虚拟机

Python 虚拟机(PVM,Python Virtual Machine)是一个抽象的计算机,它作为 Python 解释器的核心组件,负责执行 Python 字节码。PVM 实际上并不是一个独立的程序或服务,而是 Python 解释器(例如 CPython)的一部分。当我们谈论“运行 Python 代码”时,我们实际上是在谈论 PVM 解释并执行字节码。

以下是 PVM 的关键特点和详细介绍:

  1. 字节码解释器:PVM 的主要职责是读取并执行字节码。字节码是 Python 源代码经过编译后的低级、平台无关的表示。

  2. 平台独立性:由于 PVM 解释的是字节码而不是直接执行机器代码,因此 Python 代码可以轻松地在任何平台上运行,只要该平台上有合适的解释器和 PVM。

  3. 运行时环境:PVM 提供了运行时所需的所有资源,如内存管理(包括垃圾回收)、系统调用接口以及许多内置函数和类。

  4. 性能考虑:纯解释的字节码通常比原生机器代码运行得慢,因为需要一步步解释和执行,而不是直接在硬件上执行。但是,由于大量的优化技术和 JIT(即时编译)技术的应用,Python 的某些实现(如 PyPy)可以显著提高执行速度。

  5. 内存管理:PVM 内部包括一个内存分配器和垃圾回收器。这确保了对象在不再使用时可以被正确地清理,同时还处理了循环引用等复杂情况。

  6. 扩展性:虽然 PVM 主要是用 C 语言编写的(在 CPython 的情况下),但它可以与其他语言编写的代码进行互操作,例如 C、C++ 或 Fortran。这使得 Python 可以利用其他语言的高性能库。

  7. CPython vs 其他实现:当我们提到 PVM 时,我们通常指的是 CPython(Python 的官方实现)的虚拟机。但还有其他的 Python 实现,如 Jython(运行在 Java 虚拟机上)、IronPython(针对 .NET CLR)和 PyPy(带有 JIT 编译器的 Python)。这些实现都有自己的虚拟机和特性。

总之,Python 虚拟机是执行 Python 代码的引擎,它解释并运行字节码,提供了与操作系统和硬件之间的抽象层,确保了 Python 的跨平台特性和灵活性。

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

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

相关文章

RabbitMQ-SpringBoot2

1.依赖引用 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2.配置文件 spring: rabbitmq: host: 192.168.2.17 port: 5672 usernam…

一键去除网页BOM属性【解决乱码,头部空白,验证码不显示问题】

几个常出现的问题&#xff1a; 1.网站打开空白 2.页面头部出现多余的空白 3.网站出现乱码&#xff0c;如“锘&#xfffd;” 4.后台登录验证码不显示 解决方案&#xff1a; 1.选用专业的编辑器&#xff0c;例如notepad&#xff0c;sublime&#xff0c;editplus这样不会自…

【JAVA】数组

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈Java &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 数组 1. 数组的基本概念1.1 为什么要使用…

elementUI点击当前行更改当前行状态(数据更新DOM不更新问题解决)

<template slot-scope"{row,$index}" slot"menu"><el-button v-if"row.editable" type"text" size"small" click"changeStatus(row,$index)">编辑</el-button><el-button v-else type"…

用服务器搭建网站需要做什么

网站建设是一个广义的术语&#xff0c;涵盖了许多不同的技能和学科中所使用的生产和维护的网站。不同领域的网页设计&#xff0c;网页图形设计&#xff0c;界面设计&#xff0c;创作&#xff0c;其中包括标准化的代码和专有软件&#xff0c;用户体验设计和搜索引擎优化。许多人…

Spring Boot整合ES的两种方式

使用Spring Data Elasticsearch Starter 在Spring Boot中整合Elasticsearch的方式之一是使用Elasticsearch的官方Spring Data Elasticsearch Starter。该Starter提供了对Elasticsearch的高级集成&#xff0c;简化了配置和管理Elasticsearch客户端。 下面是使用Spring Data E…

82 | Python可视化篇 —— Plotly数据可视化

文章目录 什么是 Plotly安装 Plotly创建散点图创建线图创建条形图创建饼图创建热力图3D图(3D Plot)直方图(Histogram)3D表面图(3D Surface Plot)箱线图(Box Plot)散点地图(Scatter Map)量级地图(Choropleth Map)在网页中嵌入 Plotly 图表总结什么是 Plotly Plotly…

网关 GateWay 的使用详解、路由、过滤器、跨域配置

一、网关的基本概念 SpringCloudGateway网关是所有微服务的统一入口。 1.1 它的主要作用是&#xff1a; 反向代理&#xff08;请求的转发&#xff09; 路由和负载均衡 身份认证和权限控制 对请求限流 1.2 相比于Zuul的优势&#xff1a; SpringCloudGateway基于Spring5中…

javascript:js介绍初体验和变量以及数据类型的使用。

目录 一.介绍 1概念 2作用 3组成 二.js初体验 1.js的书写位置 a.行间引入 b.内部引入 c.外部引入​编辑 2.js的注释 3.js的结束符 4.输入输出语句 输出语法 输入语法 三.变量及数据类型 ​ 1.字面量 2.变量 ​编辑 变量的使用 ​编辑 let和var的区别…

clang-format格式化代码

1. clang-format简介 Clang-Format可用于格式化&#xff08;排版&#xff09;多种不同语言的代码。其自带的排版格式主要有&#xff1a;LLVM, Google, Chromium, Mozilla, WebKit等; 利用style参数配置风格。通过编写 .clang-format 文件&#xff0c;可以实现代码风格的配置。…

在 Linux 上以 All-in-One 模式安装 KubeSphere

官方文档&#xff1a;https://www.kubesphere.io/zh/docs/v3.3/quick-start/all-in-one-on-linux/ 操作系统 最低配置 Ubuntu&#xff1a; 16.04,18.04, 20.04, 22.04 2 核 CPU&#xff0c;4 GB 内存&#xff0c;40 GB 磁盘空间Debian Buste&#xff1a;Stretch 2 核 CPU&am…

Mac使用brew安装软件报错

在使用brew安装软件时报错Failed to upgrade Homebrew Portable Ruby! brew install --cask --appdir/Applications docker> Downloading https://ghcr.io/v2/homebrew/portable-ruby/portable-ruby/blobs/sha256:0cb1cc7af109437fe0e020c9f3b7b95c3c709b140bde9f991ad2c143…

网络安全学习笔记——XFF攻击流程

手工注入 手动报错注入&#xff0c;填写格式如&#xff1a;X-Forwarded-For: and updatexml(1,concat(0x7e,(select database()),0x7e),1) or 11 库名 1 and updatexml(1,concat(0x7e,database(),0x7e),1), 表名 1 and updatexml(1,concat(0x7e,(select table_name from…

【严重】Smartbi商业智能BI软件权限绕过漏洞

漏洞描述 Smartbi 是一款商业智能应用&#xff0c;提供了数据集成、分析、可视化等功能&#xff0c;帮助用户理解和使用他们的数据进行决策。 在 Smartbi 受影响版本中存在权限绕过问题&#xff0c;未授权的攻击者可以通过 RMI 的方式调用 getPassword 接口获取管理员 token …

PostgreSQL常用函数

PostgreSQL常用函数 内置函数 PostgreSQL 内置函数也称为聚合函数&#xff0c;用于对字符串或数字数据执行处理。 下面是所有通用 PostgreSQL 内置函数的列表&#xff1a; COUNT 函数&#xff1a;用于计算数据库表中的行数。MAX 函数&#xff1a;用于查询某一特定列中最大值…

jQuery知识

DOM知识 alert(我是弹窗); prompt(弹窗输入);Dom元素节点获取 方式一&#xff1a;通过 id 获取 一个 元素节点&#xff08;为什么是一个呢&#xff1f;因为 id 是唯一的&#xff09; var div1 document.getElementById("box1"); 方式二&#xff1a;通过 标签名 获…

【数据分析】pandas( 二)

目录 简介&#xff1a; 一&#xff0c;1.1来自Series字典或字典 1.2 来自ndarray或者列表的字典&#xff1a; 1.3来自结构化或记录数组; 1.4来自字典列表&#xff1a; 1.4来自元组的字典&#xff1a; 1.5 来自Series 二&#xff0c;代替构造函数&#xff1a; 2.1DataFram…

conda 环境 numpy 安装报错需要 Microsoft Visual C++ 14.0

到公司装深度学校环境。项目较旧&#xff0c;安装依赖&#xff0c;一堆报错&#xff08;基于 conda 环境&#xff09;&#xff1a; numpy 安装报需要 C 14.0 No module named numpy.distutils._msvccompiler in numpy.distutils; trying from distutilserror: Microsoft Visu…

预测知识 | 预测模型变量重要性、可视化及论文撰写指南

预测知识 | 预测模型变量重要性、可视化及论文撰写指南 目录 预测知识 | 预测模型变量重要性、可视化及论文撰写指南变量重要性模型可视化论文撰写指南参考资料 变量重要性 关于预测模型变量重要性&#xff0c;大家一定熟悉不过。但如下图所示&#xff0c;其展示上可有进一步优…

网络安全进阶学习第十三课——SQL注入Bypass姿势

文章目录 一、等号被过滤二、substr、mid等被过滤三、逗号被过滤四、and/or被过滤五、空格被过滤五、其他绕过方式 一、等号被过滤 1、like&#xff0c;rlike语句&#xff0c;其中rlike是正则2、大于号>&#xff0c;小于号<3、符号<>&#xff1a;<>为不等于…