Python字节码文件

news2025/1/11 8:09:49

e270889445d3c0d06e44e0f55b37044a.png

迷途小书童的 Note

读完需要

5

分钟

速读仅需 2 分钟

大家好,我是迷途小书童!

今天给大家介绍一个神奇的文件 -- pyc 文件,它能加速 Python 程序的执行速度,同时也能起到保护源码的作用。

1

   

什么是 pyc 文件?

pyc 文件是经过编译的 Python 字节码文件,其中的 c 是 compiled 的缩写。当我们执行一个 python 源文件时,Python 解释器会先将 python 文件编译成 pyc 文件,然后再执行 pyc 文件。

pyc 文件和 py 文件是一一对应的,文件名相同,只是扩展名不同。pyc 文件无法直接读取,需要反汇编后才能查看内容。

2

   

解释型语言和编译型语言

计算机是不能够识别高级语言的,所以当我们运行一个高级语言编写的程序的时候,就需要将高级语言翻译成计算机能读懂的机器语言。这个过程分成两类,第一种是编译,另一种是解释。编译型语言在程序执行之前,会先通过编译器对程序执行一个编译的过程,把程序转变成机器语言,运行的时候就不需要翻译,而直接执行就可以了,C 语言就是最典型的编译型语言。解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是 Ruby。由此可见,在运行效率上,解释型语言是无法跟编译型语言相比的。

那问题来了,python 到底是解释型语言还是编译型语言?

python 是编译型 + 解释型的语言,执行的时候是由 python 解释器,逐行编译和解释,然后运行,所以 python 的运行性能会低于编译型语言。为了提高性能,python 解释器,会将模块(往往是需要复用的代码)的编译 + 解释的结果,保存在 pyc 中。这样下次执行的时候,就省了编译这个环节,提高了性能。一次性的脚本文件(比如只有 test.py 且不调用 module 模块),解释器默认是不会保存编译 + 解释的结果,也就是没有 pyc 文件。

3

   

示例

这里准备 2 个文件,被调用模块 module.py,内容是

def add(x,  y):
    return x + y

在 test.py 文件中调用 module 中的 add 方法并打印输出

from module import add


a = 2
b = 4
c = add(a, b)
print(c)

2ebc1e6bbe58c85218a8d3a1b7f9a3eb.png

然后打开终端 powershell,执行 python test.py,在同一级目录下会生成文件夹 __pycache__,在 __pycache__ 目录下还有一个文件 module.cpython-37.pyc,它是一个二进制文件

78110674edbe7059237a89a150c4241f.png

通过使用在线 pyc 反编译工具 https://tool.lu/pyc/ ( https://tool.lu/pyc/ ) 知道,module.cpython-37.pyc 就是模块 module.py 编译后的内容

ce3f0d6c9a14dff39fe4edc62d27879a.png

接下来,我们修改下 module.py,加句注释

# add comment
def add(x,  y):
    return x + y

然后再次执行 python test.py,我们会发现 __pycache__下的module.cpython-37.pyc 也被修改了

aa911a6cf443ee744bf1d06e175fe0e0.png

我们进入到 __pycache__,将 module.cpython-37.pyc 重命名为 model.pyc,然后将上层目录中的 test.py 拷贝过来,接着执行 python test.py

8c18b56fd5e64d20d6ce4f797643bd8d.png

可以看到,我们可以直接在 python 源码中直接使用 pyc 文件,而不需要 module.py 了,这有点像 c 语言中动态库或静态库,pyc 的这种用法通常用来保护源码。

前面我们讲过解释器默认不支持单文件生成 pyc,如果想生成,需要设定参数处理

python -m py_compile test.py

97fe935ec35feeb2d9c6f806e9d4e6ae.png

生成了 __pycache__,我们进入文件夹,可以直接执行 pyc

python test.cpython-37.pyc

9484401dcdbdb5836daeb5fe1f619751.png

4

   

免费社群

ff47713d1a9ea402b0e1f4193bcd432a.jpeg

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

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

相关文章

PYTHON-“人生重开模拟器“

🚀write in front🚀 🔎大家好,我是Aileen★。希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🆔本文由 Aileen_0v0★ 原创 CSDN首发🐒 如需转载还…

SAP-PP:基础概念笔记-5(物料主数据的MRP1~4视图)

文章目录 前言一、MRP1视图Base Unit of Measure(UoM)MRP 组采购组ABC 指示器Plant-Specific Material Status 特定的工厂物料状态MRP 类型 MRP TypeMRP 类型 MRP TypeMaster Production Scheduling(MPS) 主生产计划基于消耗的计划(CBP)再订货点Reorder-…

【业务功能篇91】微服务-springcloud-多线程-线程池执行顺序

一、线程的实现方式 1. 线程的实现方式 1.1 继承Thread class ThreadDemo01 extends Thread{Overridepublic void run() {System.out.println("当前线程:" Thread.currentThread().getName());} }1.2 实现Runnable接口 class ThreadDemo02 implements Runnable{…

介绍几个搜索引擎

Google:全球最大的搜索引擎,提供全面的搜索服务,包括网页、图片、视频、新闻、地图等。 Baidu:中国最大的搜索引擎,提供类似于Google的全面搜索服务,同时也有网盘、知道等功能。 Bing:微软公司…

Linux持续学习者的实用命令:sed

引言 作为一名Linux持续学习者,我们经常需要对文本内容进行处理或修改,这时候sed命令就能派上用场了。sed是一个强大的流式文本编辑器,它可以在读取文本时进行修改并输出,支持各种复杂的字符串替换、内容删除、行插入等操作。在本…

Linux的目录结构特点

Linux的目录结构特点 1、使用树形目录结构来组织和管理文件。 2、整个系统只有一个根目录(树根),Linux的根目录用“/”表示。 3、其他所有分区以及外部设备(如硬盘,光驱等)都是以根目录为起点&#xff0…

[华为云云服务器评测] Unbutnu添加SSH Key、编译启动Springboot项目

系列文章目录 第一章 [linux实战] 华为云耀云服务器L实例 Java、node环境配置 第二章 [linux实战] Unbutnu添加SSH Key、启动Springboot项目 文章目录 系列文章目录前言一、任务拆解二、配置git,添加SSH Key2.1、登录远程主机2.2、配置git用户名和邮箱2.3、生成SSH key2.4、查…

说说redo log 与 undo log

redo log redo log叫做重做日志.用于解决数据库事物提交 还未刷入磁盘,服务器down机导致的数据丢失的问题。 InnoDB作为MySQL的存储引擎,数据存储在磁盘中,如果每次读写数据都要操作磁盘IO效率会很低,为此InnoDB提供了缓存(Buffer Pool)&am…

无涯教程-JavaScript - STDEVP函数

STDEVP函数替代Excel 2010中的STDEV.P函数。 描述 该函数根据作为参数给出的整个总体计算标准偏差。标准偏差是对值与平均值(平均值)的分散程度的度量。 语法 STDEVP (number1,[number2],...)争论 Argument描述Required/OptionalNumber1The first number argument corresp…

文件包含漏洞及漏洞复现

文件包含漏洞 1. 文件包含概述 程序开发人员通常会把可重复使用函数或语句写到单个文件中,形成“封装”。在使用某个功能的时候,直接调用此文件,无需再次编写,提高代码重用性,减少代码量。这种调用文件的过程通常称为…

机器学习与数据分析

【数据清洗】 异常检测 孤立森林(Isolation Forest)从原理到实践 效果评估:F-score 【1】 保护隐私的时间序列异常检测架构 概率后缀树 PST – (异常检测) 【1】 UEBA架构设计之路5: 概率后缀树模型 【…

单独创建一个线程并执行

C并发编程入门 目录 STL 写法 #include <thread> #include <iostream> using namespace std;void thread_fun(void) {cout << "one STL thread!" << endl; }int main(void) {std::thread thread1(thread_fun);thread1.join();return 0; }其…

数字IC验证——PSS可移植测试用例

PSS是Accellera组织定义的测试用例生成规范&#xff0c;其思想是定义一个抽象模型&#xff0c;EDA工具可以从中生成适用于每个设计层次结构和每个验证平台的测试&#xff0c;即PSS定义了统一的测试场景&#xff0c;而场景的使用可以横跨不同验证层次和配置。 这种特性决定了PSS…

docker笔记8:Docker网络

1.是什么 1.1 docker不启动&#xff0c;默认网络情况 ens33 lo virbr0 在CentOS7的安装过程中如果有选择相关虚拟化的的服务安装系统后&#xff0c;启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡(virbr0网卡&#xff1a;它还有一个固定的默认IP地址192.168.122…

快速掌握STM32工程创建

STM32 工程创建-- 使用Keil uVision5 软件 晓理紫 1 准备库函数库 STM32F10x_StdPeriph_Lib_V3.5.0 VX 搜索“晓丽紫”关注回复STM32F10x即可下载 2、创建一个目录用来存放工程 STM32Study STM32Study/study1 存放本次工程目录 3、打开Keil uVision5 创建工程 4、选择型号(根据…

租服务器训练深度学习模型

一、选择租哪个 推荐用AutoDL(便宜、功能强大、gug少、有时时客服解决问题) AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL 二、注册、登录 学生可以认证&#xff0c;享受会员价 服务器需要登录后先充值&#xff0c;先充个10元&#xff0c;接下来试试看。每次都是开机…

Web framework-Gin(二)

一、Gin 1、Ajax AJAX 即“Asynchronous Javascript And XML”&#xff08;异步 JavaScript和 XML&#xff09;&#xff0c;是指一种创建交互式、快速动态网页应用的网页开发技术&#xff0c;无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。通过在后台与服…

AppleID切换验证手机

第一步&#xff1a;登录个人信息页面 https://appleid.apple.com/account/manage/section/security 第二步&#xff1a;选择账户安全 第三步&#xff1a;验证新手机号即可

供应链 | 顶会CIKM论文精读:面向大规模三维装箱问题的数据驱动树形搜索算法

论文解读&#xff1a;丁建辉&#xff0c;李明哲&#xff0c;赵艳蓉&#xff0c;孙楚天 编者按 本次解读的文章发表于CCF-B类会议30th ACM International Conference on Information and Knowledge Management。摘要总结如下&#xff1a; 3维装箱问题&#xff08;3D-BPP&#…

2023第二届陇剑杯网络安全大赛 预选赛Writeup

题目附件 链接&#xff1a;https://pan.baidu.com/s/1J20VusdMjit4coWAi5lnnQ 提取码&#xff1a;6emq 文章目录 HWhard_web_1hard_web_2hard_web_3 SSsevrer save_1sevrer save_2sevrer save_3sevrer save_4sevrer save_5sevrer save_6sevrer save_7sevrer save_8 WSWireshar…