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,一经查实,立即删除!

相关文章

【算法集训】基础算法:双指针

344. 反转字符串 // 双指针思路 void reverseString(char* s, int sSize) {int i 0,j sSize - 1;while(i < j) {char tmp s[i];s[i] s[j];s[j] tmp;i , j --;} }392. 判断子序列 // 双指针 bool isSubsequence(char* s, char* t) {// 定义s和t的下标指针int i 0, j …

使用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;剩下的内容就…

ES6+对象常用方法

1.往Object里面添加元素 const obj {timeArr: [],fileIds: [],isVerifyOrder: res?.isVerifyOrder ? "true" : "false",isCompose: res?.isCompose ? "true" : "false",};Object.assign(res, obj);//往res添加属性const obj Ob…

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;或者使用云上操作系统【例如租阿…

40V耐压5A同步整流DCDC降压恒压芯片 高效率 外围小

同步整流恒压芯片是一种电源管理芯片&#xff0c;它能够在不同电压输入条件下保持输出电压恒定。这种芯片广泛应用于各种电子设备中&#xff0c;如通讯设备、液晶显示器、上网本、机顶盒等。 同步整流恒压芯片的工作原理是利用开关稳压器在输入电压和输出电压之间进行能量传递&…

GraphQL入门教程:构建更高效的APIs

GraphQL入门教程&#xff1a;构建更高效的APIs GraphQL是一个用于API的查询语言&#xff0c;由Facebook于2015年公开发布。它允许客户端精确地指定它们需要从API获取哪些数据&#xff0c;从而使数据交换更加高效和强大。与传统的REST API相比&#xff0c;GraphQL提供了更加灵活…

问答系统开发:基于深度学习的文本理解与生成

目录 1.前言 2.问答系统架构与流程 2.2.架构概述 2.3.流程描述 3.使用Transformer模型处理问答任务 3.1.BERT在问答任务中的应用 4.实现简单的交互式问答系统 5.总结 1.前言 本文旨在详细介绍问答系统的架构与流程&#xff0c;以及如何利用Transformer模型&#xff08;…

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

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

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

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

抖音降权限流后怎么办?可以考虑这样自查!

在抖音运营过程中&#xff0c;可能会遇到账号被降权限流的情况。面对这种情况&#xff0c;我们可以从以下几个方面进行自查&#xff0c;以找出问题所在并采取相应措施。 1 账号安全检查 包括敏感操作自查和违规操作检查。在敏感操作自查方面&#xff0c;需要回顾账号的历史操…

设计模式——行为型——责任链模式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…

Debian/Ubuntu安装ping和netstat命令

sudo apt-get install net-tools#如果需要ping的话&#xff0c;安装如下软件 sudo apt-get install iputils-ping Debian/Ubuntu无netstat命令解决方案 Messay

python基础知识5——时间的处理和转换

python程序能用很多方式处理日期和时间&#xff0c;转换日期格式是一个常见的功能。 1、time模块 1.1、获取当前时间戳(unix时间戳)import time tick time.time() print(tick)1.2、# 获取时间元组import time t time.localtime() # 可传入unix时间戳进行转换 print(t)1.3、…

跨境运营必看: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…

记一个Unity的异常问题

今天同事给我反馈了一个Unity使用ThreadStatic的问题&#xff0c;问题如下&#xff1a; [ThreadStatic]private static Dictionary<int, Mesh> dic;IEnumerator Start(){dic new Dictionary<int, Mesh>();dic.Add(0, new Mesh());yield return Resources.UnloadUn…

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

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