当前位置: 首页 > news >正文

关于Python:9. 深入理解Python运行机制

一、Python内存管理(引用计数、垃圾回收)

Python(CPython)采用的是:

“引用计数为主,垃圾回收为辅” 的内存管理机制。

也就是说:

  • 引用计数机制:负责大部分内存释放,简单、高效。

  • 垃圾回收机制(GC):处理循环引用等引用计数解决不了的问题。

1. 引用计数(Reference Counting)

每个 Python 对象都有一个“引用计数”,表示当前有多少个地方在使用它。

一旦引用计数为 0,Python 立刻销毁对象、释放内存。

举例说明:

a = [1, 2, 3]  # 创建列表对象,引用计数 = 1
b = a          # b 也指向这个列表,对象引用计数 = 2
del a          # 删除 a,引用计数 = 1
del b          # 删除 b,引用计数 = 0,对象被销毁

可以使用 sys.getrefcount() 查看一个对象的引用计数:

import sys
x = [1, 2, 3]
print(sys.getrefcount(x))  # 注意:结果比你预期的多1,因为参数x也算一次引用

引用计数的优点:

  • 实时释放内存:对象不用的时候,立刻回收。

  • 实现简单:不需要像 Java 那样复杂的 GC 跑一遍遍。

2. 引用计数的缺陷:循环引用

如果两个对象互相引用对方,即使外部没有引用了,引用计数也不会为0,内存就不会释放,导致 内存泄露

示例:

class Node:def __init__(self):self.ref = Nonea = Node()
b = Node()
a.ref = b
b.ref = adel a
del b# a和b虽然没有外部引用,但它们互相引用,所以内存不会释放!

在这个例子中:

对象谁引用了它?引用计数
amain作用域、b.ref2
bmain作用域、a.ref2

现在执行 del adel b

对象谁引用了它?引用计数
a只剩 b.ref1
b只剩 a.ref1

引用计数永远不会变为 0!

3. 垃圾回收(Garbage Collection,GC)

为了解决循环引用的问题,Python 内部设计了一个 GC模块 来“定期清理”不再使用的内存。

这个 GC 是通过 “分代回收(Generational GC)” 实现的。

分代回收模型(Generational GC)

Python 把所有的对象分成 3 代:

代数含义特点
第0代新建对象最频繁回收
第1代经常存活下来的对象偶尔回收
第2代长期存在的对象很少回收,数量最多

GC 机制假设:

“活得越久的对象,越有可能继续活着”,所以越老的代回收越少。

回收的流程

  • Python 会监控“分配了多少个对象”和“删除了多少个对象”。

  • 当分配/删除数量超过阈值,就触发 GC:

    • 先回收第0代

    • 如果仍然触发阈值,就继续回收第1代、第2代

  • 采用标记-清除算法:标记“可达对象”,删除“不可达对象”

GC 模块使用示例:

import gc# 查看当前是否启用了自动GC
print(gc.isenabled())  # True# 手动触发一次GC
gc.collect()# 查看GC统计信息
print(gc.get_count())  # 返回 (第0代对象数量, 第1代, 第2代)

4. 小对象内存池机制

CPython 还对**小对象(小于 512 字节)**做了优化:

  • 使用内存池(称为 pymalloc)重复利用内存块。

  • 这样避免频繁向操作系统申请/释放内存,提高性能。

这就是为什么写 a = 10; b = 10 时,两个变量可能指向的是同一个对象地址

5. 总结

机制原理优点缺点
引用计数每个对象维护引用计数,0即销毁实时、高效不能处理循环引用
垃圾回收分代收集,标记清除弥补引用计数的缺陷增加一些系统开销
小对象池内存池优化小对象提高小对象复用效率占用一些额外内存

二、Python解释器(CPython、PyPy)

Python 解释器就是把你写的 .py 源码翻译为计算机能执行的“指令”的程序。

目前主流解释器有多个实现:

名称语言实现特点适用场景
CPython用 C 写的官方标准实现,最常用默认解释器,稳定
PyPy用 RPython 写支持 JIT,速度更快追求性能
Jython用 Java 写可运行在 JVM 上,调用 JavaJava 环境
IronPython.NET 实现支持 C#/VB 调用.NET 环境
MicroPythonC实现(精简)运行在嵌入式设备单片机开发

1. CPython(最主流、最重要)

  • CPython 是 Python 的官方实现

  • 是用 C语言 写的解释器(Interpreter)。

  • 所有你运行 .py 的地方,默认就是 CPython。

$ python3 --version
Python 3.11.7  ← 这就是 CPython

CPython 的执行流程

Python 源码(.py 文件)↓
词法/语法分析↓
AST(抽象语法树)↓
编译成字节码(.pyc 文件)↓
交由 CPython 的虚拟机解释执行

这也是为什么会看到 .pyc 文件,它其实就是:

        Python 的“中间语言”,类似 Java 的 .class 文件。

CPython 底层结构

typedef struct _object {Py_ssize_t ob_refcnt;     // 引用计数PyTypeObject *ob_type;    // 类型信息
} PyObject;

CPython(Python 的官方解释器)就是用 C 语言编写的

Py_ssize_t ob_refcnt;       // 当前对象的引用计数,决定是否自动释放
PyTypeObject *ob_type;      // 指向该对象的类型结构体,比如 int、str 类型

每个 Python 中的对象(int、list、dict 等)在底层都是一个 PyObject 结构体,通过这个结构可以知道:

  • 它被引用了多少次(用于自动内存管理)

  • 它到底是什么类型(用于运行时类型识别)

CPython 的缺陷:GIL(全局解释器锁)

CPython 使用 GIL 来确保多线程安全:

Global Interpreter Lock→ 同一时间,只允许一个线程执行 Python 字节码

这意味着 Python 的多线程并不能真正并发运行计算密集型任务。CPU 利用率低。

2. PyPy(性能极致的解释器)

  • PyPy 是用一种叫 RPython(可静态类型的Python子集) 实现的 Python 解释器。

  • 最大亮点是 JIT(Just-In-Time)编译技术,可以把热代码编译成机器码,加速运行。

PyPy 的优势

特性说明
 JIT 编译PyPy 会将频繁执行的代码“编译为机器码”加速运行
 智能优化内联、移除多余变量等操作自动完成
⏱ 性能提升实测一般比 CPython 快 4~10 倍

例如:

from time import timedef f():s = 0for i in range(10_000_000):s += ireturn sstart = time()
f()
print("耗时:", time() - start)

同样的代码,用 PyPy 跑会明显快很多。

如何下载安装 PyPy:

1)访问官网下载页面:https://www.pypy.org/download.html

2)解压缩到一个目录,比如:C:\pypy3.9

3)打开命令行,输入:

C:\pypy3.9\pypy3.exe

如果是 Linux / Mac 用户:

sudo apt install pypy3       # Ubuntu
# 或
brew install pypy3           # Mac(需安装 Homebrew)

4)运行代码用 PyPy 解释器

比如:

pypy3 your_script.py

或者:

pypy3
>>> print("hello from PyPy!")

这样就不再用默认的 CPython 。


三、编译原理初步(AST抽象语法树、字节码)

Python 作为一种 解释型语言,它的代码执行过程包括了“编译”和“解释”两个阶段:

编译阶段:把 Python 源代码编译成一种中间表示形式(字节码),这个字节码并不是直接机器码,而是 Python 虚拟机能理解的低级指令。

解释执行阶段:字节码由 Python 解释器(虚拟机)执行。

这两个过程中的重要组成部分就是 AST(抽象语法树) 和 字节码。

1. 什么是 AST(抽象语法树)?

AST(抽象语法树) 是对 Python 源代码的一种树状表示,它的每个节点代表了 Python 程序中的一个结构元素(如表达式、语句等)。它比语法树更简洁,去除了与编程语言具体语法无关的部分。

  • AST 是 Python 编译阶段的产物。

  • Python 代码首先通过 词法分析(将源码转换为标记)和 语法分析(将标记转换为 AST)两步生成。

  • 在 AST 之上,Python 可以进行代码优化、分析、转换、生成字节码等操作。

 AST 的重要性

  • 代码分析与优化:通过 AST,你可以分析代码的结构,做静态分析(例如变量的使用、控制流等)或进行代码优化。

  • 代码转换:AST 是生成字节码的基础,修改 AST 可以进行代码重写、反混淆等操作。

  • 反向工程:通过分析 AST,你可以将混淆代码或压缩代码还原为易懂的原始代码结构。

生成 AST

可以使用 Python 的 ast 模块来分析和操作 Python 的 AST。例如,下面的代码将 Python 代码解析成 AST:

import astsource_code = "x = 1 + 2 * 3"
tree = ast.parse(source_code)# 打印 AST 的结构
ast.dump(tree, indent=4)

输出会是类似这样的结构(树状结构):

Module(body=[Assign(targets=[Name(id='x', ctx=Store())],value=BinOp(left=Num(n=1), op=Add(), right=BinOp(left=Num(n=2), op=Mult(), right=Num(n=3))))]
)

这就是 Python 代码的 AST 结构。可以看到,它把算式 1 + 2 * 3 转换成了一个树状结构,节点包含了操作符、操作数、表达式等。

AST 操作示例

通过操作 AST,你可以修改代码结构,比如实现代码重构、自动化修改等:

class MyTransformer(ast.NodeTransformer):def visit_BinOp(self, node):if isinstance(node.op, ast.Add):node.op = ast.Sub()  # 把加法变成减法return node# 修改 AST
transformer = MyTransformer()
transformed_tree = transformer.visit(tree)# 查看修改后的树
ast.dump(transformed_tree, indent=4)

2. 什么是字节码(Bytecode)?

字节码 是一种中间代码,Python 将源代码编译成字节码后,由 Python 的虚拟机(PVM)解释执行。它比源代码更接近机器码,但仍然独立于平台。

  • 字节码的作用:通过将源码编译成字节码,Python 可以实现跨平台运行,只需要安装 Python 解释器,就能执行相同的字节码。

  • .pyc 文件:字节码通常保存在 .pyc 文件中,位于 __pycache__ 目录下。Python 会根据文件的修改时间来决定是否重新编译。

字节码的生成过程

  1. 编译:Python 源代码通过 CPython 编译器转换为字节码(.pyc 文件)。每次你运行 .py 文件时,CPython 会首先检查是否有 .pyc 文件,如果没有就编译成字节码。

  2. 执行:字节码通过 Python 虚拟机(PVM)解释执行。

字节码反汇编

使用 dis 模块,可以看到 Python 代码的字节码。例如:

import disdef example():a = 1 + 2return adis.dis(example)

输出结果会显示字节码:

  2           0 LOAD_CONST               1 (1)2 LOAD_CONST               2 (2)4 BINARY_ADD6 STORE_NAME               0 (a)8 LOAD_NAME                0 (a)10 RETURN_VALUE

这说明:

  • 先把常量 12 加载到栈上(LOAD_CONST),

  • 执行加法(BINARY_ADD),

  • 把结果存到变量 a 中(STORE_NAME)。

字节码与机器码的关系

字节码比源代码更接近机器码,但它仍然不是直接可以由 CPU 执行的代码。在 CPython 中,字节码是由 Python 解释器逐条解释执行的。而机器码则是直接由硬件执行的代码。

3. 结合 AST 和 字节码的实际应用

应用场景:代码重构、反混淆

在做 JS 逆向APP 逆向时,很多时候需要分析混淆代码并重构它。在 Python 中,AST 是一个非常好的工具,可以帮助理解代码的结构,进行重构、逆向等操作。

例子:重构混淆代码

比如,将一段复杂的运算式改写为更易读的形式:

# 混淆的代码
x = 1 + 2 * 3# 解析并重构为
x = 7

通过 AST,可以提取出原始的运算结构,并将它们转换为更容易理解的形式。

应用场景:性能优化

在性能优化中,了解 Python 如何将源代码转化为字节码,有助于优化代码,避免不必要的计算、内存分配等操作。例如,避免频繁的内存分配、减少不必要的对象创建,可以提高程序的性能。

术语含义作用
AST抽象语法树,一种树状结构代码结构分析、重构、静态分析、代码生成和优化
字节码中间代码,比源码更低级,但不依赖平台Python 跨平台运行,虚拟机解释执行

四、C扩展开发(如需要极限优化)

C 扩展就是使用 C 语言编写的 Python 模块,它可以被 Python 调用,像普通模块一样 import

为什么要用 C 写 Python 模块?

  • Python 本身是用 C 写的(CPython)

  • Python 解释型的性能较低,尤其在数值计算、循环密集任务中较慢

  • C 语言性能高,可以编写性能关键模块,再用 Python 调用

  • 还能直接调用操作系统或硬件资源,或者加载第三方底层库(如 OpenSSL)

实际例子:写一个简单的 C 扩展模块

创建一个 C 模块 myfast.c,提供一个加法函数给 Python 调用。

文件结构:

myfast/
├── myfast.c
└── setup.py

1) myfast.c 内容如下:

#include <Python.h>// C函数:两个数相加
static PyObject* add(PyObject* self, PyObject* args) {int a, b;// 从 Python 传入参数解析为 C 中的 intif (!PyArg_ParseTuple(args, "ii", &a, &b)) {return NULL;}// 返回一个 Python 整数return PyLong_FromLong(a + b);
}// 定义方法表
static PyMethodDef MyFastMethods[] = {{"add", add, METH_VARARGS, "Add two numbers"},{NULL, NULL, 0, NULL}
};// 定义模块
static struct PyModuleDef myfastmodule = {PyModuleDef_HEAD_INIT,"myfast",       // 模块名NULL,           // 文档(可为 NULL)-1,MyFastMethods
};// 初始化模块
PyMODINIT_FUNC PyInit_myfast(void) {return PyModule_Create(&myfastmodule);
}

2) setup.py 构建脚本:

from setuptools import setup, Extensionmodule = Extension('myfast', sources=['myfast.c'])setup(name='myfast',version='1.0',description='A demo C extension for Python',ext_modules=[module]
)

3)编译模块

运行:

python setup.py build_ext --inplace

这会生成一个 .so 文件(Linux/mac)或 .pyd(Windows),然后就可以像普通模块一样导入:

4)Python 中使用

import myfastprint(myfast.add(3, 5))  # 输出 8

高级应用方向

调用已有 C/C++ 库(如 OpenSSL、libcurl)

可以封装 C 函数为 Python 接口,甚至是使用 extern 引用已有 .so/.dll

写“黑盒”模块

很多商业代码、加密算法,甚至反爬参数逻辑会被写成 C 模块,然后 只暴露一个接口给 Python,大大提高逆向难度。

 用于性能关键场景

在图像处理、数据加密、音视频处理、矩阵运算、机器学习中,Python 常调用 NumPy(内部也是 C 实现)。

相关文章:

关于Python:9. 深入理解Python运行机制

一、Python内存管理&#xff08;引用计数、垃圾回收&#xff09; Python&#xff08;CPython&#xff09;采用的是&#xff1a; “引用计数为主&#xff0c;垃圾回收为辅” 的内存管理机制。 也就是说&#xff1a; 引用计数机制&#xff1a;负责大部分内存释放&#xff0c;简…...

Cron表达式的用法

最近几天开发东西用到了定时脚本的问题&#xff0c;中间隔了一段时间没有用到&#xff0c;再次复习一下Cron表达式的用法。 Cron表达式是一种用于定义定时任务执行时间的字符串格式&#xff0c;广泛应用于Unix/Linux系统以及各种编程语言中。其主要用途是通过灵活的时间规则来…...

手机通过局域网访问网狐接口及管理后台网站

1.本地部署接口及后台网站 2.设置允许网站端口通过防火墙 3.查看网站服务器IP 4.手机连接到本地服务器同一局域网 5.手机访问本地服务器接口...

JavaSE核心知识点01基础语法01-01(关键字、标识符、变量)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点01基础语法01-01&#xff0…...

Sliding Window Attention(Longformer)

最简单的自注意力大家肯定都会啦。 但这种全连接的自注意力&#xff08;即每个 token 需要 attend 到输入序列中的所有其他 token&#xff09;计算与内存开销是 O ( n 2 ) O(n^2) O(n2) 。为了缓解这个问题&#xff0c;研究者们提出了 Sliding Window Attention。 Sliding W…...

ROS2 开发踩坑记录(持续更新...)

1. 从find_package(xxx REQUIRED)说起&#xff0c;如何引用其他package(包&#xff09; 查看包的安装位置和include路径详细文件列表 例如&#xff0c;xxx包名为pluginlib # 查看 pluginlib 的安装位置 dpkg -L ros-${ROS_DISTRO}-pluginlib | grep include 这条指令的目的是…...

刷leetcodehot100返航版--哈希表5/5、5/6

回顾一下之前做的哈希&#xff0c;貌似只有用到 unordered_set&#xff1a;存储无序元素unordered_map&#xff1a;存储无序键值对 代码随想录 常用代码模板2——数据结构 - AcWing C知识回顾-CSDN博客 1.两数之和5/5【30min】 1. 两数之和 - 力扣&#xff08;LeetCode&am…...

嵌入式开发学习日志Day13

第九章 预处理命令 前面加“#”的都为预处理命令&#xff1b; 预处理命令是无脑的文本替换&#xff1b; 一、宏定义 1、不带参数的宏定义 一般形式为&#xff1a; #define 标识符 字符串 &#xff08;谷歌规定&#xff09;&#xff1a;所有的宏名均大写&#xff0c;便于…...

AI预测的艺术品走势靠谱吗?

首席数据官高鹏律师团队 AI预测艺术品价格走势&#xff1a;技术与法律的双重考量在当今数字化浪潮席卷全球的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度渗透到各个领域&#xff0c;艺术品市场也不例外。AI预测艺术品价格走势这一新兴事物&…...

AVL树 和 红黑树 的插入算法

1.AVL树 按照二叉搜索树的规则找到要插入的位置并插入&#xff0c;插入过后看是父节点的左还是右孩子&#xff0c;然后把父节点的平衡因子-1或1&#xff0c;调整后如果父节点的平衡因子是0&#xff0c;那就说明这颗子树的高度插入前后不变&#xff0c;上面的就不用调整平衡因子…...

【项目】基于ArkTS的网吧会员应用开发(1)

一、效果图展示 二、界面讲解 以上是基于ArkTS的鸿蒙应用网吧会员软件的引导页&#xff0c;使用滑动组件滑动页面&#xff0c;至最后一页时&#xff0c;点击立即体验&#xff0c;进入登录页面。 三、代码演示 import promptAction from ohos.promptAction; import router fr…...

命令模式(Command Pattern)

非常好&#xff01;现在我们来深入讲解行为型设计模式之一 —— 命令模式&#xff08;Command Pattern&#xff09;。 我将通过&#xff1a; ✅ 定义解释 &#x1f3af; 使用动机 &#x1f40d; Python 完整调用代码&#xff08;含注释&#xff09; &#x1f9ed; 清晰类图 …...

CMake基础介绍

1、CMake 概述 CMake 是一个项目构建工具&#xff0c;并且是跨平台的&#xff1b;关于项目构建目前比较流行的还有 Makefile(通过 Make 命令进行项目的构建)&#xff0c; 大多 IDE 软件都集成了 make,比如&#xff1a;VS 的 nmake、linux 下的 GNU make、Qt 的 qmake 等&…...

偷钱包行为检测数据集VOC+YOLO格式922张1类别有增强

有320张图片是原图剩余为增强图片 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;922 标注数量(xml文件个数)&#xff1a;922 标注数量…...

C 语言比较运算符:程序如何做出“判断”?

各类资料学习下载合集 ​​https://pan.quark.cn/s/8c91ccb5a474​​ 在编写程序时,我们经常需要根据不同的条件来执行不同的代码。比如,如果一个分数大于 60 分,就判断为及格;如果用户的年龄小于 18 岁,就禁止访问某个内容等等。这些“判断”的核心,就依赖于程序能够比…...

Webug4.0靶场通关笔记16- 第20关文件上传(截断上传)

目录 第20关 文件上传(截断上传) 1.打开靶场 2.源码分析 &#xff08;1&#xff09;右键查看前端源码 &#xff08;2&#xff09;服务端源码分析 &#xff08;3&#xff09;渗透思路 3.渗透实战 &#xff08;1&#xff09;构建脚本 &#xff08;2&#xff09;bp抓包 …...

10 种最新的思维链(Chain-of-Thought, CoT)增强方法

防御式链式思维&#xff08;Chain-of-Defensive-Thought&#xff09; 该方法通过引入结构化、防御性的推理示例&#xff0c;提高大语言模型在面对被污染或误导信息时的稳健性。 &#x1f4c4; 论文链接&#xff1a;https://arxiv.org/abs/2504.20769 混合链式思维&#xff08;…...

力扣119题解

记录 2025.5.5 题目&#xff1a; 思路&#xff1a; 代码: class Solution {public List<Integer> getRow(int rowIndex) {List<Integer> row new ArrayList<Integer>();row.add(1);for (int i 1; i < rowIndex; i) {row.add((int) ((long) row.get(i…...

NSOperation深入解析:从使用到底层原理

1. 基础概念与使用 1.1 NSOperation概述 NSOperation是Apple提供的一个面向对象的并发编程API&#xff0c;它基于GCD&#xff08;Grand Central Dispatch&#xff09;构建&#xff0c;但提供了更高层次的抽象和更丰富的功能。NSOperation允许开发者以面向对象的方式管理并发任…...

suna工具调用可视化界面实现原理分析(二)

这是一个基于React的浏览器操作可视化调试组件&#xff0c;主要用于在AI开发工具中展示网页自动化操作过程&#xff08;如导航、点击、表单填写等&#xff09;的执行状态和结果。以下是关键技术组件和功能亮点的解析&#xff1a; 一、核心功能模块 浏览器操作状态可视化 • 实时…...

【大模型面试每日一题】Day 9:BERT 的 MLM 和 GPT 的 Next Token Prediction 有什么区别?

【大模型面试每日一题】Day 9&#xff1a;BERT 的 MLM 和 GPT 的 Next Token Prediction 有什么区别&#xff1f; &#x1f4cc; 题目重现 &#x1f31f; 面试官&#xff1a;预训练任务中&#xff0c;BERT 的 MLM&#xff08;Masked Language Modeling&#xff09;和 GPT 的 …...

分析strtol(),strtoul()和strtod()三个函数的功能

字符串转换为数值部分和子字符串首地址的函数有strtol(),strtoul()和strtod()三个函数。 1、strtol()函数 long int strtol(const char *str, char **endptr, int base) //当base0时,若字符串不是以"0","0x"和"0X"开头,则将数字部分按照10进制…...

Spring Boot 加载application.properties或application.yml配置文件的位置顺序。

我换一种更通俗易懂的方式&#xff0c;结合具体例子来解释 Spring Boot 加载application.properties或application.yml配置文件的位置顺序。 生活场景类比 想象你要找一本书&#xff0c;你有几个可能存放这本书的地方&#xff0c;你会按照一定顺序去这些地方找&#xff0c;直…...

C++进阶之——多态

1. 多态的概念 多态是用来描述这个世界的 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会 产生出不同的状态。 这里就很厉害了&#xff0c;能够实现特殊处理&#xff0c;本文章就是来仔细…...

第13项三期,入组1123例:默沙东启动TROP2 ADC+PD-1子宫内膜癌头对头临床

Umabs DB作为目前全球最全面的抗体药物专业数据库&#xff0c;收录全球近10000个从临床前到商业化阶段抗体药物&#xff0c;涉及靶点1600&#xff0c;涉及疾病种类2400&#xff0c;研发机构2900&#xff0c;覆盖药物蛋白序列、专利和临床等多种专业信息。Umabs DB药物数据库已正…...

政务服务智能化改造方案和案例分析

政务服务智能化改造方案和案例分析 一、引言 在数字化时代浪潮的推动下&#xff0c;政务服务智能化改造已成为提升政府服务效能、优化营商环境、增强民众满意度的关键举措。传统政务服务模式存在流程繁琐、信息孤岛、办理效率低等问题&#xff0c;难以满足现代社会快节奏发展和…...

15.日志分析入门

日志分析入门 第一部分&#xff1a;日志分析基础第二部分&#xff1a;日志分析方法与工具第三部分&#xff1a;日志分析实践总结 目标&#xff1a; • 理解日志分析在网络安全中的作用 • 掌握日志的基本类型和分析方法 • 通过实践初步体验日志分析的过程 第一部分&#xff…...

EPSG:3857 和 EPSG:4326 的区别

EPSG:3857 和 EPSG:4326 是两种常用的空间参考系统&#xff0c;主要区别在于坐标表示方式和应用场景。以下是它们的核心差异&#xff1a; 1. 坐标系类型 EPSG:4326&#xff08;WGS84&#xff09; 地理坐标系&#xff08;Geographic Coordinate System&#xff09;&#xff0c;基…...

Python Cookbook-7.2 使用 pickle 和 cPickle 模块序列化数据

任务 你想以某种可以接受的速度序列化和重建Python 数据结构&#xff0c;这些数据既包括基本Python 对象也包括类和实例。 解决方案 如果你不想假设你的数据完全由基本 Python 对象组成&#xff0c;或者需要在不同的 Python 版本之间移植&#xff0c;再或者需要将序列化后的…...

Java学习手册:Spring 多数据源配置与管理

在实际开发中&#xff0c;有时需要连接多个数据库&#xff0c;例如&#xff0c;一个系统可能需要从不同的数据库中读取和写入数据。Spring 提供了多种方式来配置和管理多数据源&#xff0c;以下将介绍常见的配置和管理方法。 一、多数据源配置 在 Spring 中&#xff0c;可以通…...

六、shell脚本--正则表达式:玩转文本匹配的“万能钥匙”

想象一下&#xff0c;你需要在一大堆文本&#xff08;比如日志文件、配置文件、网页代码&#xff09;里查找符合某种特定模式的字符串&#xff0c;而不是仅仅查找固定的单词。比如说&#xff1a; 找出所有的电子邮件地址 &#x1f4e7;。找到所有看起来像电话号码 &#x1f4d…...

Gradio全解20——Streaming:流式传输的多媒体应用(4)——基于Groq的带自动语音检测功能的多模态Gradio应用

Gradio全解20——Streaming&#xff1a;流式传输的多媒体应用&#xff08;4&#xff09;——基于Groq的带自动语音检测功能的多模态Gradio应用 本篇摘要20. Streaming&#xff1a;流式传输的多媒体应用20.4 基于Groq的带自动语音检测功能的多模态Gradio应用20.4.1 组件及配置1.…...

力扣hot100 (除自身以外数组的乘积)

238. 除自身以外数组的乘积 中等 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除…...

LFU算法解析

文章目录 LFU缓存中关键变量的访问与更新机制1. min_freq - 最小频率访问时机更新时机更新示例 2. capacity - 缓存容量访问时机更新时机访问示例 3. key_to_node - 键到节点的映射访问时机更新时机更新示例 4. freq_to_dummy - 频率到链表哑节点的映射访问时机更新时机更新示例…...

RHCSA笔记2

RHCSA基础命令 &#xff08;一&#xff09;命令格式 &#xff08;1&#xff09;命令名【选项】【参数】 选项&#xff1a;决定命令执行的方式&#xff0c;通常有个-或--开头 参数&#xff1a;决定命令作用的目标&#xff08;目录&#xff0c;文件&#xff0c;磁盘&#xff…...

JavaSE核心知识点01基础语法01-02(基本数据类型、运算符、运算符优先级)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点01基础语法01-02&#xff0…...

FOC算法开环控制基础

1. 为什么要有FOC算法 先看看从有刷电机到无刷电机的简单介绍&#xff0c;如下图1&#xff0c;通电螺线圈会产生磁场&#xff0c;这个磁场会产生N级和S级&#xff0c;然后这个电磁铁就可以吸引永磁体&#xff0c;S级吸引N级&#xff0c;N级吸引S级&#xff0c;通俗的来说&…...

进程间通信——管道

概念 进程间通信&#xff08;Inter-Process Communication&#xff0c;简称 IPC&#xff09;是指在不同进程之间进行数据交换和信息传递的机制。它的目的主要有4种&#xff1a; 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间…...

五一作业-day02

文章目录 1. 每日基操2. 模拟故障2.1 **remove regular empty file 是否删除普通文件(空的)?**2.2 **is a directory xxx是一个目录**2.3 **xxx not a directory 不是一个目录**2.4 Cant open file for writing2.5 **No write since last change** 3. 习题4. **进阶习题** 1. …...

Springclound常用五大组件及其使用原理

注册中心Eureka Eureka-Server&#xff1a;就是服务注册中心&#xff08;可以是一个集群&#xff09;&#xff0c;对外暴露自己的地址。 提供者&#xff1a;启动后向Eureka注册自己信息&#xff08;地址&#xff0c;服务名称等&#xff09;&#xff0c;并且定期进行服务续约 …...

Qt 显示QRegExp 和 QtXml 不存在问题

QRegExp 和 QtXml 问题 在Qt6 中 已被弃用&#xff1b; 1&#xff09;QRegExp 已被弃用&#xff0c;改用 QRegularExpression Qt5 → Qt6 重大变更&#xff1a;QRegExp 被移到了 Qt5Compat 模块&#xff0c;默认不在 Qt6 核心模块中。 错误类型解决方法QRegExp 找不到改用 Q…...

开元类双端互动组件部署实战全流程教程(第4部分:后台配置系统与参数动态控制)

作者&#xff1a;曾经因为后台配置写错&#xff0c;导致全服进不去房的工程师 组件附带的后台管理系统为 PHP 编写&#xff0c;界面简洁但功能齐全。具备完整的模块划分与权限体系&#xff0c;支持动态参数下发、日志审计、行为数据统计等。 七、前端后台交互流程图与代码示例 …...

MySQL基础关键_008_DDL 和 DML(一)

目 录 一、DDL 1.创建表 &#xff08;1&#xff09;语法格式 &#xff08;2&#xff09;实例 2.查看建表语句 &#xff08;1&#xff09;语法格式 &#xff08;2&#xff09;实例 3.修改表名 &#xff08;1&#xff09;语法格式 &#xff08;2&#xff09;实例 4.新…...

基于SpringBoot + Vue 的火车票订票系统

包含&#xff1a; [1]源码✔ 数据库文件✔ [2]万字文档✔ [3]视频与图文配置教程✔ 功能描述&#xff1a; 本系统包含管理员、用户两个角色。 管理员&#xff1a;用户管理、新闻公告管理、车辆管理、车站及路线管理、留言建议管理、车次信息管理 用户&#xff1a;购票操作、查…...

飞致云开源社区月度动态报告(2025年4月)

自2023年6月起&#xff0c;中国领先的开源软件公司飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营数据概览&…...

解决跨域的4种方法

00_跨域的概念 浏览器只允许请问具有相同的协议&#xff0c;域名&#xff0c;端口&#xff0c;进行请求&#xff0c;有一个不同&#xff0c;就会拒绝。 01.前后端协商jsonp //jsonp//jsonp 是 json with padding 的缩写&#xff0c;是一种通过 <script> 标签的 src 属性…...

C# 方法(局部函数和参数)

本章内容: 方法的结构 方法体内部的代码执行 局部变量 局部常量 控制流 方法调用 返回值 返回语句和void方法 局部函数 参数 值参数 引用参数 引用类型作为值参数和引用参数 输出参数 参数数组 参数类型总结 方法重载 命名参数 可选参数 栈帧 递归 局部函数 正如刚刚所解释的&…...

kotlin 02flow-sharedFlow 完整教程

一 sharedFlow是什么 SharedFlow 是 Kotlin 协程中 Flow 的一种 热流&#xff08;Hot Flow&#xff09;&#xff0c;用于在多个订阅者之间 共享事件或数据流。它适合处理 一次性事件&#xff08;如导航、弹窗、Toast、刷新通知等&#xff09;&#xff0c;而不是持续状态。 ✅ …...

数据库原理——E-R图的极速省流理解 例题解析

前言 数据库一节没听&#xff0c;一个小时看书给我大致看懂了 E-R概念模型极速省流版 E-R图的重点&#xff1a; 关系图&#xff0c;三要素——实体、属性、联系 图形标识——矩形、椭圆形、菱形 1.实体和属性也可以放一个框矩形框 2.菱形两层边&#xff1a;弱实体集的联…...

5.4 - 5.5Web基础+c语言拓展功能函数

StringBoot HTTP协议&#xff1a; 规定了浏览器与服务器之间数据传递的规则。 请求协议&#xff1a; 请求数据格式&#xff1a; 请求头和请求体之间有一个空行隔开 响应协议&#xff1a; 响应数据格式&#xff1a; 响应头和响应体之间存在空行隔开。 响应数据设置&#xff1…...