Python是解释型语言,为啥还有 __pycache__ 文件呢?为啥还有.pyc 文件呢?

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益:

  1. 了解大厂经验
  2. 拥有和大厂相匹配的技术等

希望看什么,评论或者私信告诉我!

文章目录

  • 一、前言
  • 二、 解惑
  • 三、总结:
  • 四、扩展-查看 PVM 字节码指令


一、前言

以前我就知道 Python 是解释型语言,能编译,最近开始写 Python 发现开始 啪啪啪 打脸了,因为我发现某个项目的目录下竟然有 pycache 文件
在这里插入图片描述

二、 解惑

Python 不是一种纯粹的解释型语言。它只是一种语言,其官方实现使用虚拟机Cpython的。目前使用的编程语言(据我所知),没有一种是单一的解释或者编译,为了效率往往会将两者回合。python亦是如此:

Python不适合简单归类为编译型或解释型语言。相反,它采用了一种混合方法:

当你编写Python代码时,它首先被编译成字节码。Python源代码被翻译成一个较低级别的表示形式,称为字节码,这是平台独立的。字节码文件具有.pyc扩展名,并存储在__pycache__目录中。
然后Python的字节码由Python虚拟机(PVM)执行。PVM读取并解释字节码,逐行执行。这种实时解释允许Python提供灵活性和可移植性。

三、总结:

总之,Python的执行模型结合了编译和解释的特点。它将源代码编译成字节码,然后使用Python虚拟机解释字节码。这种混合方法提供了两者的最佳组合:可移植性和灵活性,使Python成为世界上最受欢迎的编程语言之一。

了解Python的执行模型对Python开发人员至关重要,因为它有助于优化代码和提高性能。所以,下次有人问Python是编译的还是解释的,你可以自信地解释其独特的方法。Python可能不符合经典定义,但这正是它如此特别的原因。

四、扩展-查看 PVM 字节码指令

Python的dis模块用于反汇编Python字节码。它可以帮助你查看Python函数的底层字节码指令,这对于理解Python代码的执行过程和性能调优非常有帮助。以下是一个简单的示例来展示如何使用dis模块:

import disdef example_function(x, y):if x < y:z = x + yelse:z = x - yreturn z# 反汇编函数
dis.dis(example_function)

当你运行这段代码时,会得到类似如下的输出:

              0 LOAD_FAST                0 (x)2 LOAD_FAST                1 (y)4 COMPARE_OP               0 (<)6 POP_JUMP_IF_FALSE       168 LOAD_FAST                0 (x)10 LOAD_FAST                1 (y)12 BINARY_ADD14 STORE_FAST               2 (z)16 LOAD_FAST                0 (x)18 LOAD_FAST                1 (y)20 BINARY_SUBTRACT22 STORE_FAST               2 (z)24 LOAD_FAST                2 (z)26 RETURN_VALUE

这个输出展示了example_function函数的字节码指令。每一行都代表了一个字节码指令和它所在的行号。通过这些信息,你可以深入了解函数内部的操作,并优化代码以提高性能。

dis 是 Python 的一个标准库,用于反汇编 Python 的字节码。它提供了一种查看 Python 字节码指令的方式,可以帮助开发者理解 Python 代码的底层实现。以下是一些 dis 模块中常用的方法:

  1. dis.disassemble(code):将字节码分解为人类可读的形式,并将其打印到标准输出。

  2. dis.show_code(code, file=None):将一个代码对象(如函数对象)的字节码显示在文件或标准输出上。

  3. dis.dis(): 用于以人类可读的形式显示操作码和符号名称。

  4. dis.opmap:这是一个字典,将操作码名称映射到它们的数值。

  5. dis.bytecode:对字节码进行分析的功能,允许你检查操作码、常量、变量和标签。

这些方法可以帮助你深入了解 Python 代码背后的实际执行过程,尤其是在需要进行代码性能优化或者理解 Python 解释器内部工作时非常有用。

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

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

相关文章

使用Java流API构建树形结构数据

简介&#xff1a; 在实际开发中&#xff0c;构建树状层次结构是常见需求&#xff0c;如组织架构、目录结构或菜单系统。本教案通过解析给定的Java代码&#xff0c;展示如何使用Java 8 Stream API将扁平化的菜单数据转换为具有层级关系的树形结构。 1. 核心类定义 - Menu Data…

【图论】【拓扑排序】1857. 有向图中最大颜色值

本文涉及的知识点 图论 拓扑排序 LeetCode1857. 有向图中最大颜色值 给你一个 有向图 &#xff0c;它含有 n 个节点和 m 条边。节点编号从 0 到 n - 1 。 给你一个字符串 colors &#xff0c;其中 colors[i] 是小写英文字母&#xff0c;表示图中第 i 个节点的 颜色 &#xf…

MySQL进阶-----SQL提示与覆盖索引

目录 前言 一、SQL提示 1.数据准备 2. SQL的自我选择 3.SQL提示 二、覆盖索引 前言 MySQL进阶篇的索引部分基本上要结束了&#xff0c;这里就剩下SQL提示、覆盖索引、前缀索引以及单例联合索引的内容。那本期的话我们就先讲解SQL提示和覆盖索引先&#xff0c;剩下的内容就…

HDU1020--编码问题

试题描述 问题详情如下图所示&#xff1a;要求&#xff1a;java实现、数据结构知识 参考代码 比较垃圾&#xff0c;在别人基础上改的&#xff0c;懒得重构&#xff0c;&#xff0c;&#xff0c;仅供参考 import java.util.Scanner;public class HDU1020StringEncoding {pu…

虚拟机安装银河麒麟

背景 由于Centos将于2024-06-30结束维护【脱保】&#xff0c;届时会存在Bug无人修复及功能无人开发等问题&#xff0c;所以要赶在这个节点前完成操作系统升级。可选的就是RedHat、Ubuntu以及国产信创【中标麒麟、银河麒麟、统信等】&#xff0c;或者使用云上操作系统【例如租阿…

【笔记】通过码云Gitee获取OpenHarmony源码

Note&#xff1a;下面包含操作过程和问题解决&#xff08;首次安装Ubuntu&#xff0c;环境未完善&#xff09;&#xff0c;没有遇到问题可以直接跳过问题part了&#xff0c;小白也能完成配置下载。 前置准备&#xff08;Git环境账号&#xff09; &#xff08;一&#xff09;安…

做抖店没有产品货源?怎么玩?筛选货源的方法你需要了解清楚!

大家好&#xff0c;我是电商小布。 有很多的新手朋友们在玩抖店的时候&#xff0c;遇到的第一个问题就是自己手里没有产品在。 没有产品货源&#xff0c;也就没办法上架店铺&#xff0c;更别提交易工作了。 那么在这种情况下&#xff0c;该怎么来玩呢&#xff1f; 既然我们…

设计模式——行为型——责任链模式Chain Of Responsibility

请求类 public class ApproverRequest {private int type;//请求批准的类型private float price;//请求的金额private int id;//请求的编号 } 审批人抽象类 public abstract class ApproverPerson {protected ApproverPerson next;protected String name;//审批过程public a…

跨境运营必看:TikTok账号防封指南

多人在使用TikTok的过程中都会遇到一些问题&#xff0c;比如为什么TikTok没有浏览量&#xff1f;事实上&#xff0c;这很可能是因为你的账号已被禁止。但为什么它会被封呢&#xff1f;你怎样才能解决它&#xff1f; 一、TikTok账号为什么被封&#xff1f; 1、什么是 TikTok 影…

【隐私计算实训营008——SCQL】

1.SCQL使用/集成最佳实践 目前SCQL只开放API供用户使用/集成 使用SCDBClient上手体验可以基于SCQL API开发封装白屏产品&#xff0c;或集成到业务链路中 1.1 部署系统 环境配置&#xff1a; 机器配置&#xff1a;CPU/MEM最低8C16G机构之间的网络互通 镜像&#xff1a;secret…

Flutter应用在苹果商店上架前的准备工作与注意事项

引言 &#x1f680; Flutter作为一种跨平台的移动应用程序开发框架&#xff0c;为开发者提供了便利&#xff0c;使他们能够通过单一的代码库构建出高性能、高保真度的应用程序&#xff0c;同时支持Android和iOS两个平台。然而&#xff0c;完成Flutter应用程序的开发只是第一步…

构建开源可观测平台

企业始终面临着确保 IT 基础设施和应用程序全年可用的压力。现代架构&#xff08;容器、混合云、SOA、微服务等&#xff09;的复杂性不断增长&#xff0c;产生大量难以管理的日志。我们需要智能应用程序性能管理 (APM) 和可观察性工具来实现卓越生产并满足可用性和正常运行时间…

算法错题本

这里写目录标题 错题本注意数据的耦合性对于无解情况的处理思路一组数据以0为结束标记&#xff0c;如何输入到数组中&#xff0c;并计数多个数据进行比较链表删除重复元素的启发循环体里谨慎写类型定义并初始化&#xff08;一般写上就是错&#xff09;队列中读取队尾元素数组当…

实现3D模型无变形的减面渲染方法---模大狮模型网

在进行3D模型渲染时&#xff0c;减面(或降面)是一种常用的优化技术&#xff0c;用于降低模型的复杂度&#xff0c;提高渲染效率。然而&#xff0c;在减面过程中&#xff0c;若不小心可能会引起模型的形变或细节丢失。模大狮将介绍一些方法和技巧&#xff0c;帮助您在减面渲染时…

安卓主板MT8390(Genio 700)_MTK联发科Linux开发板方案

MediaTek Genio 700 &#xff08;MT8390&#xff09;是一款高性能的边缘 AI 物联网平台&#xff0c;专为智能家居、互动零售、工业与商业应用而设计。提供快速响应的边缘计算能力、先进的多媒体功能、广泛的传感器和连接方式&#xff0c;且支持多任务操作系统。 MT8390安卓核心…

如何同时使用多个Gmail账号而不被关联?

您的业务活动需要多个 Gmail 帐户吗&#xff1f;出海畅游&#xff0c;Gmail账号是少不了的工具之一&#xff0c;可以关联到Twitter、Facebook、Youtube、Chatgpt等等平台&#xff0c;可以说是海外网络的“万能锁”。但是大家都知道&#xff0c;以上这些平台注册多账号如果产生关…

Linux:入门篇

文章目录 前言1. Linuxd的安装环境2.Linux的简单介绍2.1 新建目录2.2 新建文件 3.指令到底是什么&#xff1f;4.shell命令以及运行原理5.总结 前言 很多人对于Linux的学习总是感觉无法下手&#xff0c;不知道从何开始学习&#xff0c;相信这篇文章将会为你提供一个清晰的思路。…

【SpringBoot整合系列】SpirngBoot整合EasyExcel

目录 背景需求发展 EasyExcel官网介绍优势常用注解 SpringBoot整合EaxyExcel1.引入依赖2.实体类定义实体类代码示例注解解释 3.自定义转换器转换器代码示例涉及的枚举类型 4.Excel工具类5.简单导出接口SQL 6.简单导入接口SQL 7.复杂的导出&#xff08;合并行、合并列&#xff0…

mysql 本地电脑服务部署

前提&#xff1a; 下载mysql 新建配置文档 在安装mysql目录新建 my.ini [mysqld] # 设置3306端口 port3306#设置mysql的安装目录 basedirC:\Program Files\MySQL\MySQL Server 8.3 #切记此处一定要用双斜杠\\,单斜杠我这里会出错&#xff0c;不过看别人的教程&#xff0c;有…

Docker容器与虚拟化技术:OpenEuler 部署 Docker UI

目录 一、实验 1.环境 2.OpenEuler 部署 docker-compose-ui 2.OpenEuler 部署 docker ui 3.使用cpolar内网穿透 二、问题 1.docker run -w 的作用 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 192.168…