Python解释器:CPython 解释器
一、什么是python解释器
Python解释器是一种用于执行Python代码的程序。
它将Python源代码转换为机器语言或字节码,从而使计算机能够执行。
1.1 Python解释器分类
1、CPython
CPython 是 Python 的主要实现,由 C 语言编写。大多数用户在日常开发中使用的 Python 版本都是 CPython。
2、Jython
Jython:将 Python 代码编译成 Java 字节码,可以在 JVM 上运行。这使得 Python 代码可以与 Java 互操作,特别适合于需要与 Java 生态系统集成的项目。
3、IronPython
IronPython:在 .NET 平台上运行的 Python 实现,将 Python 代码编译成 .NET 的中间语言(IL),可以与 .NET 框架集成
4、PyPy
PyPy:一个通过 JIT(即时编译)技术提高性能的 Python 解释器。与 CPython 相比,PyPy 在某些情况下可以显著提升代码的执行速度。
每种解释器都有其独特的优势和适用场景,选择合适的解释器取决于项目的需求,例如性能要求、平台兼容性、与其他语言的集成等。
总体来说,Python 解释器是 Python 语言的关键组成部分,它负责将开发者编写的高级 Python 代码转换为底层系统能够理解和执行的指令集,从而实现代码的运行和功能实现。
1.2 Python 与Java运行方式不同
Python 和 Java 在运行方式上有显著的区别,这些区别主要源于它们的执行环境和语言设计的差异:
1、解释执行 vs 编译执行:
-
Python 是一种解释型语言,它的代码在运行时通过解释器逐行地执行。Python 代码会被解释器即时翻译成字节码,然后由Python虚拟机(CPython、PyPy等)执行。这种解释方式使得 Python 代码可以跨平台运行,但通常比编译型语言执行速度较慢。
-
Java 是一种编译型和解释型混合的语言。Java 代码首先被编译成字节码(.class 文件),然后由Java虚拟机(JVM)解释执行。JVM 可以将字节码实时编译成本地机器码(即时编译),从而提高执行效率。这种方式结合了编译型语言的高效性和解释型语言的跨平台特性。
2、运行时环境:
-
Python 的运行时环境由解释器管理,不需要显式的编译步骤。开发者可以直接运行 .py 文件,由解释器执行其中的代码。
-
Java 的运行时环境需要先将源代码编译成字节码,然后在JVM上运行。这个过程中包含了编译、装载、链接和初始化等步骤。JVM 负责在不同平台上执行字节码,实现了“一次编写,到处运行”的跨平台特性。
3、性能:
-
由于 Python 是解释执行的,其执行速度通常比较慢,特别是对于大量计算密集型的任务。尽管有些优化措施(如使用JIT编译的PyPy)可以改善性能,但通常不及编译型语言。
-
Java 的执行速度较快,因为字节码可以被JVM即时编译成本地机器码。这使得 Java 适合于需要高性能的应用程序,如企业级应用、大型系统等。
4、静态类型 vs 动态类型:
-
Python 是一种动态类型语言,变量的类型在运行时确定,可以动态改变。
-
Java 是一种静态类型语言,所有的变量和表达式在编译时期就确定其类型,并且类型通常是严格检查的。
总结来说,Python 和 Java 在运行方式上的不同主要体现在解释执行 vs 编译执行、运行时环境、性能特征和类型系统等方面。这些特性决定了它们在不同场景下的适用性和优劣势。
二、CPython解释器
CPython 是 Python 的官方解释器。
在日常语境中,人们有时会交替使用“Python版本”和“Python解释器版本”,但从技术角度来看,它们指的是同一个事物:由Python官方发布的、具有特定版本号的软件实现。
当你从Python官网下载并安装了Python 3.8和Python 3.9,你的系统中确实会有两个不同版本的Python解释器。每个版本都有其独立的安装目录、可执行文件(例如python.exe
)、标准库和可能的第三方库。
当你说“我有Python 3.8和Python 3.9两个版本的解释器”时,实际上你是在说你的系统中安装了两个不同版本的Python。
查看python解释器的位置(就是我们常说的python安装的位置
which python
win的用户解释器为pyhton.exe
2.1 CPython解释器结构
CPython 是 Python 的官方解释器,它用 C 语言实现,是 Python 最常用的解释器之一。下面是 CPython 解释器的基本结构和一些关键组成部分的详细介绍:
当谈论CPython解释器的基本结构时,我们需要关注几个关键组成部分:
1、词法分析器(Lexer)和语法分析器(Parser):
- 词法分析器负责将源代码转换成标记(tokens),这些标记是语法分析器的输入。它识别出代码中的关键字、标识符、运算符等基本单元。
- 语法分析器将这些标记转换为抽象语法树(Abstract Syntax Tree,AST)。AST 是源代码的抽象表示形式,捕捉了代码结构和语义。
2、编译器:
- CPython 在解释执行之前会对 AST 进行编译,生成字节码(bytecode)。字节码是一种与平台无关的中间代码,类似于Java的字节码。它包含一系列的指令(如 LOAD_CONST, CALL_FUNCTION),用于在虚拟机中执行相应的操作。
3、解释器核心 (Interpreter Core):
- 字节码解释器 (Bytecode Interpreter):CPython 的核心功能是执行 Python 源代码转换而来的字节码。字节码是一种中间形式,可以被 CPython 解释器执行。
- 内存管理 (Memory Management):CPython 使用自己的内存管理器来管理 Python 对象的分配和释放。这包括引用计数和垃圾回收机制。
- 解释器主循环 (Interpreter Main Loop):解释器的主循环负责从字节码中读取指令,并执行这些指令以完成对 Python 代码的解释和执行。
4、语言核心 (Language Core):
- 数据类型 (Data Types):CPython 实现了 Python 的基本数据类型,如整数、浮点数、列表、元组、字典等。这些类型在 CPython 中都有对应的 C 结构体表示。
- 对象模型 (Object Model):CPython 使用 C 结构体来表示 Python 中的对象,例如 PyIntObject 表示整数对象,PyListObject 表示列表对象等。
- 异常处理 (Exception Handling):CPython 通过 C 的异常处理机制来实现 Python 中的异常处理功能。
5、标准库 (Standard Library):
- CPython 包含了丰富的标准库,提供了大量的功能和工具,用于处理文件 I/O、网络通信、多线程编程、正则表达式等。
6、扩展机制 (Extension Mechanism):
- CPython 允许开发者使用 C 或 C++ 编写扩展模块,这些扩展模块可以与 Python 的核心部分无缝集成,扩展 Python 的功能。这些扩展模块可以通过 Python 的 C API 与解释器进行交互。
7、工具和实用程序 (Tools and Utilities):
- CPython 还包括了一些工具和实用程序,如解释器启动器 (
python
)、交互式解释器 (python -i
)、源码调试器 (pdb
) 等等,这些工具使得开发和调试 Python 程序更加便捷。
这些组件共同工作,构成了CPython 解释器的基本结构,支持了 Python 语言的解释、执行和扩展。
2.2 CPython 解释器执行 Python 代码的基本过程
CPython 解释器执行 Python 代码的基本过程:
源代码 -> 词法分析 -> 语法分析 -> 字节码生成 -> 字节码执行
1、读取 Python 源代码:
CPython 会首先读取整个 Python 源代码文件。
2、词法分析(Lexical Analysis):
词法分析器将源代码分解为词法单元(tokens),例如标识符、运算符、关键字等。这些 tokens 是语法分析器的输入。
3、语法分析(Syntax Analysis):
语法分析器根据词法单元构建语法树(Abstract Syntax Tree,AST)。它检查语法的正确性,确保代码符合 Python 的语法规则。
4、生成字节码(Bytecode Generation):
一旦语法分析器生成了 AST,CPython 将 AST 转换为字节码。字节码是一种中间表示形式,类似于汇编语言,但是针对 Python 虚拟机(PVM)执行的指令集。
5、执行字节码(Bytecode Execution):
最后,Python 虚拟机(PVM)执行生成的字节码。PVM 是 CPython 中的核心组成部分,负责解释和执行字节码指令,操作 Python 对象,管理内存,处理异常等。
三、CPython 的内存管理机制
CPython 的内存管理机制主要包括两个关键部分:内存分配和垃圾回收。
CPython 是 Python 的一种实现,它使用了 C 语言来编写核心的解释器部分。Python 的内存管理在 CPython 中是通过 Python 对象的引用计数和垃圾回收机制来实现的。
3.1. 内存分配
在 CPython 中,内存分配主要是针对 Python 对象的管理。Python 中的所有对象(如整数、浮点数、字符串、列表等)都存储在堆上,而不是栈上。具体的内存分配机制如下:
-
内存池(Memory Pool):CPython 使用了内存池技术来管理小型对象的内存分配。内存池主要包括针对常用的小对象大小(如 1-512 字节)的预先分配和缓存。这样做可以减少内存碎片化和提高内存分配效率。
-
引用计数(Reference Counting):CPython 使用引用计数来追踪和管理内存中对象的引用情况。每个对象都有一个引用计数器,记录当前指向该对象的引用数。当引用计数减少到 0 时,表示没有任何引用指向该对象,CPython 将释放该对象占用的内存空间。
3.2 垃圾回收(Garbage Collection)
虽然引用计数可以有效地处理大部分对象的内存释放,但是对于循环引用(两个或多个对象相互引用,但是没有被外部对象引用)情况,引用计数机制无法正确处理。为了解决这个问题,CPython 引入了垃圾回收机制,主要通过以下方式来回收循环引用的对象:
-
标记-清除算法(Mark and Sweep):CPython 的主要垃圾回收机制是基于标记-清除算法。在周期性的垃圾回收过程中,Python 解释器会遍历所有的对象,标记出活动对象(还在使用的对象),然后清除未标记的对象(即被释放的对象)。这个过程确保了循环引用的对象可以正确地被释放和回收。
-
分代回收(Generational Collection):CPython 使用了分代回收的策略,将对象分为不同的代(generations)。一般情况下,新创建的对象存放在年轻代(young generation),而经过多次垃圾回收仍然存活的对象会被移到老年代(old generation)。这种分代回收机制可以提高垃圾回收的效率,因为大部分对象都是短时间内就不再使用的。
3.2.1 垃圾回收(Garbage Collection)
CPython 使用分代垃圾回收机制,主要包括三个代:
- 第0代(Generation 0):包含新创建的对象。
- 第1代(Generation 1):包含经过一次垃圾回收仍存活的对象。
- 第2代(Generation 2):包含经过多次垃圾回收仍存活的对象。
垃圾回收通过周期性地检查和清理不再被引用的对象来回收内存。CPython 使用了标记-清除(mark and sweep)算法来进行垃圾回收:
- 标记阶段:从一组根对象(如当前活跃的 Python 对象、全局变量等)出发,遍历对象的引用关系,标记所有可以访问到的对象。
- 清除阶段:清除所有未被标记的对象,释放它们占用的内存空间。
1. 引用计数(Reference Counting)
在 CPython 中,每个 Python 对象都包含一个引用计数器,用来记录当前指向该对象的引用数目。当一个对象被创建时,引用计数初始化为 1。当对象被引用时,引用计数增加;当对象不再被引用时,引用计数减少。当引用计数降为 0 时,表示没有任何指针指向该对象,此时对象被认为是不可达的,可以被销毁和回收。
引用计数的优点是实时性高,对象在不再需要时可以立即释放。但是,引用计数无法处理循环引用的情况,例如对象 A 引用了对象 B,而对象 B 同时也引用了对象 A,这会导致循环引用的对象永远无法被释放,从而造成内存泄漏。为了解决循环引用问题,CPython 引入了垃圾回收机制。
2. 对象的生命周期
在 Python 中,对象的生命周期由引用计数和垃圾回收共同管理:
- 引用计数 管理对象的短期生命周期,即对象在不再被引用时立即释放。
- 垃圾回收 管理长期存活的对象,解决循环引用等问题,确保内存的有效利用。
总结
CPython 的内存管理机制通过内存池技术、引用计数和垃圾回收算法,有效地管理和释放 Python 对象的内存。这些机制不仅确保了内存的高效使用,也保证了 Python 程序的稳定性和性能。
四、Cpython中的堆(heap)和栈(stack)
在 CPython 中,堆和栈是两个不同的概念,它们并不直接对应于 Python 语言中的堆(heap)和栈(stack)数据结构,而是指内存管理的两个不同区域,用于存储程序执行中的不同类型的数据:
1、堆(Heap):
在 CPython 中,堆指的是用于存储所有对象和数据的动态分配内存区域。这些对象包括所有的 Python 对象、字符串、列表等。Python 中的堆是由 Python 的内存管理器(Memory Allocator)进行管理的,它会动态分配和释放内存空间以满足程序运行时的需求。
2、栈(Stack):
栈在 CPython 中指的是执行函数调用时使用的栈空间。每当调用一个函数时,Python 解释器会为该函数创建一个帧对象(frame),帧对象包含了函数的调用信息、局部变量、返回地址等。这些帧对象会形成一个调用栈,即调用栈帧(call stack frames),用于管理函数的嵌套调用和返回过程。
具体来说:
- 堆(Heap):存储所有的对象和数据,由 Python 内存管理器进行动态分配和释放。
- 栈(Stack):存储函数调用时的执行上下文信息,如局部变量、函数参数等。
这两个概念不同于数据结构中的堆和栈,而是涉及到 CPython 内存管理和执行流程中的两个重要部分。
五、为什么Python 的模块本身就是天然的单例模式
5.1、实现单例模式的方式:使用模块
Python 的模块本身就是天然的单例模式。模块在第一次导入时会被初始化,并且只会初始化一次。其他模块导入同一个模块,实际上是导入了同一个实例。
# singleton_module.py
class Singleton:def __init__(self):passsingleton_instance = Singleton()
其他模块导入 singleton_module
即可使用单例实例 singleton_instance
。
5.2、为什么Python 的模块本身就是天然的单例模式
在 Python 中,模块(module)在第一次被导入时会被初始化,并且在整个解释器进程的生命周期中只会被初始化一次。这个特性使得模块在 Python 中天然具备了单例模式的效果。
让我们深入探讨一下为什么这种特性能够实现单例模式:
1、初始化一次:
- 当 Python 解释器第一次遇到
import module_name
语句时,它会执行模块module_name.py
中的代码,并将其中定义的函数、类、变量等加载到内存中。这个过程称为模块的初始化。 - 初始化完成后,模块会被缓存起来,以便后续的导入操作不会重复执行初始化过程。
2、模块缓存:
- Python 使用
sys.modules
字典来缓存所有已经导入的模块。在导入一个模块时,Python 首先检查这个字典中是否已经存在这个模块的记录。 - 如果存在,则直接从
sys.modules
中获取已经加载过的模块对象,而不会再重新执行模块的初始化代码。
3、单例效果:
- 因为模块在解释器生命周期内只会被初始化一次,并且初始化后的实例被缓存,后续的导入操作都会直接使用这个缓存的实例。这意味着无论在代码的哪个地方导入这个模块,得到的都是同一个模块实例。
- 这与单例模式的核心思想相符:保证一个类只有一个实例,并提供一个全局访问点。
4、适用性:
- Python 中的模块天然地具备了单例模式的特性,这种方式简单而有效,适合大多数情况下需要使用单例的场景。
- 开发者可以利用模块来管理全局状态或共享资源,而不必手动实现单例模式的复杂性,如线程安全的实现等。
总结来说,Python 中的模块在首次导入时被初始化且只初始化一次,并且后续的导入操作都是获取同一个实例,这种特性使得模块天然具备了单例模式的效果,从而简化了单例模式的实现过程。
5.3 代码示例
一个常见的应用场景是在一个 Web 应用程序中使用单例模式来管理全局的配置信息或者数据库连接池。让我们以管理数据库连接池为例进行说明。
假设我们有一个数据库连接池的模块 database.py
,我们希望在整个应用程序中共享同一个数据库连接池,以提高效率和资源利用率。
database.py:
import psycopg2
from psycopg2 import pool
from configparser import ConfigParser# 读取数据库配置
config = ConfigParser()
config.read('database.ini')# 获取数据库连接池配置
db_params = {'minconn': config.getint('Database', 'minconn'),'maxconn': config.getint('Database', 'maxconn'),'dbname': config.get('Database', 'dbname'),'user': config.get('Database', 'user'),'password': config.get('Database', 'password'),'host': config.get('Database', 'host'),'port': config.get('Database', 'port')
}# 创建 PostgreSQL 连接池
connection_pool = pool.ThreadedConnectionPool(**db_params)def get_connection():"""获取数据库连接"""return connection_pool.getconn()def release_connection(conn):"""释放数据库连接"""connection_pool.putconn(conn)
在这个示例中,database.py
模块通过 psycopg2
提供的 ThreadedConnectionPool
创建了一个 PostgreSQL 数据库连接池。get_connection()
函数用于获取一个数据库连接,而 release_connection()
函数用于释放数据库连接回连接池。
使用示例:
# main.pyfrom database import get_connection, release_connectiondef query_data():conn = get_connection()cursor = conn.cursor()cursor.execute("SELECT * FROM users")rows = cursor.fetchall()cursor.close()release_connection(conn)return rowsif __name__ == "__main__":data = query_data()print(data)
在 main.py
中,我们通过导入 database.py
并调用 get_connection()
和 release_connection()
函数来获取和释放数据库连接。这样,整个应用程序中的所有模块都共享同一个数据库连接池,确保了资源的有效利用和数据库连接的高效管理。
在不同的文件中多次调用 get_connection()
,但它们都会获取同一个数据库连接池中的连接。这是因为 database.py
模块中的 connection_pool
是在模块加载时创建的,并且在整个应用程序的生命周期中都保持不变。
Python 的模块在程序中只会加载一次,因此 database.py
模块中的 connection_pool
对象也只会在第一次导入时创建一次。之后的每次导入和调用 get_connection()
都会使用同一个连接池实例,确保了在整个应用程序中共享同一个数据库连接池。
在 Python 中,对象通常存储在堆(heap)中,包括连接池对象 connection_pool
以及它所管理的连接对象。具体来说:
-
连接池对象 (
connection_pool
):在 Python 中,所有的对象,包括类实例和连接池对象,都存储在堆中。堆是一块用于动态分配内存的区域,用于存储程序运行时创建的对象和数据结构。连接池对象connection_pool
也会被分配到堆上。 -
连接对象:连接池管理的实际数据库连接对象也会存储在堆中。这些连接对象是由数据库连接池动态创建和管理的,每个连接对象实际上是一个 Python 对象,也存储在堆中。
连接池对象本身在 Python 中是一个自定义的数据结构,通常是通过 Python 内置的数据结构(如字典或列表)实现的。这些数据结构也会被分配到堆上。
总之,无论是连接池对象还是其管理的连接对象,它们都存储在 Python 的堆中。
相关文章:

Python解释器:CPython 解释器
一、什么是python解释器 Python解释器是一种用于执行Python代码的程序。 它将Python源代码转换为机器语言或字节码,从而使计算机能够执行。 1.1 Python解释器分类 1、CPython CPython 是 Python 的主要实现,由 C 语言编写。大多数用户在日常开发中使…...

layui 让table里的下拉框不被遮挡
记录:layui 让table里的下拉框不被遮挡 /* 这个是让table里的下拉框不被遮挡 */ .goods_table .layui-select-title,.goods_table .layui-select-title input{line-height: 28px;height: 28px; }.goods_table .layui-table-cell {overflow: visible !important; }.…...

【性能优化】在大批量数据下使用 HTML+CSS实现走马灯,防止页面卡顿
切换效果 页面结构变化 1.需求背景 项目首页存有一个小的轮播模块,保密原因大概只能这么展示,左侧图片右侧文字,后端一次性返回几百条数据(开发环境下,生产环境只会更多).无法使用分页解决,前端需要懒加载防止页面卡顿 写个小demo演示,如下 2.解决思路 获取到数据后,取第一…...
https和http区别
1、安全性 HTTP信息是明文传输,而HTTPS则通过SSL/TLS协议进行加密传输,确保数据传输的安全性。HTTPS可以验证服务器身份,防止中间人攻击,保护数据的完整性和保密性。 2、端口号 HTTP默认使用80端口,而HTTPS默认使用…...

SD-AI大模型的安装
📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 ☁️运维工程师的职责:监…...
UDP-如何实现客户端与服务器端的通信(一对一、一对多、多对一、多对多之间的通信)
Java中提供了DatagramSocket来实现这个功能 1.服务器端的程序 创建Socket,监听6666端口读取来自客户端的“数据包”,创建数据包(通过DatagramPacket实现数据包的创建)接收数据包从数据包中,读取数据(通过recieve()接收数据和send()发送给数据) 代码如下…...

C++那些事之依赖注入
C那些事之依赖注入 最近星球里面有个小伙伴让更新一下依赖注入,于是写出了这篇文章,来从实际的例子讲解,本文会讲解一些原理与实现,完整的实现代码懒人版放在星球中,我们开始正文。 大纲: 直接依赖接口依赖…...
克隆的TrinityCore服务器网速慢卡顿问题的解决(未解决)
一台TrinityCore服务器,采用的是备份克隆安装的方式,在FreeBSD bhyve 中安装Ubuntu,安装细节见如下两篇文档:尝试在FreeBSD 的jail、bhyve里安装TrinityCore-CSDN博客 备份和镜像TrinityCore_魔兽世界 updating auth database...…...

独立站外链如何影响搜索引擎排名?
独立站的外链对搜索引擎排名有着非常重要的影响。简单来说,外链就像是别的网站对你的网站投的信任票。每一条外链都告诉搜索引擎:“这个网站的内容是有价值的,值得推荐。”因此,外链的数量和质量直接影响你的网站在搜索引擎中的排…...
java设计模式:03-04-装饰器模式
装饰器模式(Decorator Pattern) 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰器模式通过创建一个装饰类来包装原有的类,…...

通过splunk web服务将服务器上文件下载到本地
1. 需求说明 工作中经常遇到需要将服务器上的文件下载到本地,但是由于各种网络环境限制,没办法使用winscp或者xftp工具,那么如何将服务器上的文件下载下来呢? 这里提供一种思路: 如果服务器上安装有web服务,可将待下…...
Node.js 路由
Node.js 路由 介绍 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它允许开发者使用 JavaScript 编写服务器端代码。Node.js 的一个核心特性是其事件驱动和非阻塞 I/O 模型,这使得它非常适合处理高并发和 I/O 密集型的应用程序。在 Node.js 中,路由是指确定应…...

Adobe国际认证详解-网页设计认证专家行业应用场景解析
在当今数字化时代,网页设计已成为各行各业不可或缺的一环。而网页设计认证专家,作为经过Adobe国际认证体系严格考核的专业人才,正逐渐成为行业内炙手可热的存在。他们凭借深厚的网页设计理论基础和实践经验,为各行各业提供了高质量…...
ESC(ELectronic Stability Control,电子稳定控制系统)
ESC通过实时监测车辆的动态参数,以及车辆轮胎的实际运动状态,通过调节车辆制动系统和发动机输出力,使车辆在紧急或危险情况下保持稳定,防止侧滑和失控。 ESC组成部分 传感器:用于检测车辆的动态参数,如车…...

减分兔搜题-12123学法减分20题目及答案 #媒体#职场发展
对于即将参加驾驶考试的朋友来说,掌握一些经典题目和答案至关重要。今天,我就为大家带来了这样一份干货——20道驾驶考试题目和答案,助你轻松应对考试!这些题目不仅包括了考试中常考的内容,还有针对难点和重点的详细解…...

java用freemarker导出word
freemarker导出word 第一步、将word转换为xml格式第二步、将转换后的xml文件修改后缀为ftl后复制到项目 resources 目录下(可以自己新建一个文件夹放在文件夹中)第三步、格式化xml代码(如果问价太大可能会无法格式化)这时候需要在…...

CH01_WPF概述
第1章:WPF概述 本章目标 了解Windows图形演化了解WPF高级API了解分辨率无关性概念了解WPF体系结构了解WPF 4.5 WPF概述 欢迎使用 Windows Presentation Foundation (WPF) 桌面指南,这是一个与分辨率无关的 UI 框架,使用基于矢量的呈现引…...

秒懂设计模式--学习笔记(11)【结构型-享元模式】
目录 10、享元模式10.1 享元模式10.2 举例10.2.1 马赛克10.2.2 游戏地图(以草原地图作为范例) 10.3 总结 10、享元模式 10.1 享元模式 “享元”则是共享元件的意思享元模式的英文flyweight是轻量级的意思,这就意味着享元模式能使程序变得更…...
Python爬虫——1爬虫基础(一步一步慢慢来)
一、爬虫是什么? (spider) Python 爬虫是利用编程语言 Python 来获取互联网上的数据的技术。它可以自动化地访问网页、提取信息并进行数据处理。以下是Python爬虫的基础知识和步骤: 主要特点和功能: 自动化浏览&#…...
【js自学打卡9】抛出异常 / 幂计算 / 发布订阅 / map小知识点
1. 抛出异常的写法 抛出一个简单的字符串错误 throw Error2; // 抛出一个字符串抛出一个Error对象 throw new Error(出错了!);抛出一个自定义错误对象 function UserError(message) {this.message message;this.name "UserError"; } throw new User…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...