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

动手学深度学习12.1. 编译器和解释器-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。

本节课程地址:无

本节教材地址:12.1. 编译器和解释器 — 动手学深度学习 2.0.0 documentation

本节开源代码:...>d2l-zh>pytorch>chapter_optimization>hybridize.ipynb


编译器和解释器

目前为止,本书主要关注的是命令式编程(imperative programming)。 命令式编程使用诸如print、“+”和if之类的语句来更改程序的状态。 考虑下面这段简单的命令式程序:

def add(a, b):return a + bdef fancy_func(a, b, c, d):e = add(a, b)f = add(c, d)g = add(e, f)return gprint(fancy_func(1, 2, 3, 4))

输出结果:
10

Python是一种解释型语言(interpreted language)。因此,当对上面的fancy_func函数求值时,它按顺序执行函数体的操作。也就是说,它将通过对e = add(a, b)求值,并将结果存储为变量e,从而更改程序的状态。接下来的两个语句f = add(c, d)g = add(e, f)也将执行类似地操作,即执行加法计算并将结果存储为变量。 图12.1.1 说明了数据流。

尽管命令式编程很方便,但可能效率不高。一方面原因,Python会单独执行这三个函数的调用,而没有考虑add函数在fancy_func中被重复调用。如果在一个GPU(甚至多个GPU)上执行这些命令,那么Python解释器产生的开销可能会非常大。此外,它需要保存ef的变量值,直到fancy_func中的所有语句都执行完毕。这是因为程序不知道在执行语句e = add(a, b)f = add(c, d)之后,其他部分是否会使用变量ef

符号式编程

考虑另一种选择符号式编程(symbolic programming),即代码通常只在完全定义了过程之后才执行计算。这个策略被多个深度学习框架使用,包括Theano和TensorFlow(后者已经获得了命令式编程的扩展)。一般包括以下步骤:

  1. 定义计算流程;
  2. 将流程编译成可执行的程序;
  3. 给定输入,调用编译好的程序执行。

这将允许进行大量的优化。首先,在大多数情况下,我们可以跳过Python解释器。从而消除因为多个更快的GPU与单个CPU上的单个Python线程搭配使用时产生的性能瓶颈。其次,编译器可以将上述代码优化和重写为print((1 + 2) + (3 + 4))甚至print(10)。因为编译器在将其转换为机器指令之前可以看到完整的代码,所以这种优化是可以实现的。例如,只要某个变量不再需要,编译器就可以释放内存(或者从不分配内存),或者将代码转换为一个完全等价的片段。下面,我们将通过模拟命令式编程来进一步了解符号式编程的概念。

def add_():return '''
def add(a, b):return a + b
'''def fancy_func_():return '''
def fancy_func(a, b, c, d):e = add(a, b)f = add(c, d)g = add(e, f)return g
'''def evoke_():return add_() + fancy_func_() + 'print(fancy_func(1, 2, 3, 4))'prog = evoke_()
print(prog)
# compile函数将字符串prog编译为代码对象
# 第一个参数是代码字符串,第二个参数是文件名(空字符串意味着代码不是从文件中读取的),
# 第三个参数是模式,'exec'表示代码是一个可执行的程序
y = compile(prog, '', 'exec')
# 用exec函数执行编译后的代码对象
exec(y)

输出结果:
def add(a, b):
return a + b

def fancy_func(a, b, c, d):
e = add(a, b)
f = add(c, d)
g = add(e, f)
return g
print(fancy_func(1, 2, 3, 4))
10

命令式(解释型)编程和符号式编程的区别如下:

  • 命令式编程更容易使用。在Python中,命令式编程的大部分代码都是简单易懂的。命令式编程也更容易调试,这是因为无论是获取和打印所有的中间变量值,或者使用Python的内置调试工具都更加简单;
  • 符号式编程运行效率更高,更易于移植。符号式编程更容易在编译期间优化代码,同时还能够将程序移植到与Python无关的格式中,从而允许程序在非Python环境中运行,避免了任何潜在的与Python解释器相关的性能问题。

混合式编程

历史上,大部分深度学习框架都在命令式编程与符号式编程之间进行选择。例如,Theano、TensorFlow(灵感来自前者)、Keras和CNTK采用了符号式编程。相反地,Chainer和PyTorch采取了命令式编程。在后来的版本更新中,TensorFlow2.0和Keras增加了命令式编程。

如上所述,PyTorch是基于命令式编程并且使用动态计算图。为了能够利用符号式编程的可移植性和效率,开发人员思考能否将这两种编程模型的优点结合起来,于是就产生了torchscript。torchscript允许用户使用纯命令式编程进行开发和调试,同时能够将大多数程序转换为符号式程序,以便在需要产品级计算性能和部署时使用。

Sequential的混合式编程

要了解混合式编程的工作原理,最简单的方法是考虑具有多层的深层网络。按照惯例,Python解释器需要执行所有层的代码来生成一条指令,然后将该指令转发到CPU或GPU。对于单个的(快速的)计算设备,这不会导致任何重大问题。另一方面,如果我们使用先进的8-GPU服务器,比如AWS P3dn.24xlarge实例,Python将很难让所有的GPU都保持忙碌。在这里,瓶颈是单线程的Python解释器。让我们看看如何通过将Sequential替换为HybridSequential来解决代码中这个瓶颈。首先,我们定义一个简单的多层感知机。

import torch
from torch import nn
from d2l import torch as d2l# 生产网络的工厂模式
def get_net():net = nn.Sequential(nn.Linear(512, 256),nn.ReLU(),nn.Linear(256, 128),nn.ReLU(),nn.Linear(128, 2))return netx = torch.randn(size=(1, 512))
net = get_net()
net(x)

输出结果:
tensor([[ 0.0913, -0.0081]], grad_fn=<AddmmBackward0>)

通过使用torch.jit.script函数来转换模型,我们就有能力编译和优化多层感知机中的计算,而模型的计算结果保持不变。

net = torch.jit.script(net)
net(x)

输出结果:
tensor([[ 0.0913, -0.0081]], grad_fn=<AddmmBackward0>)

我们编写与之前相同的代码,再使用torch.jit.script简单地转换模型,当完成这些任务后,网络就将得到优化(我们将在下面对性能进行基准测试)。

通过混合式编程加速

为了证明通过编译获得了性能改进,我们比较了混合编程前后执行net(x)所需的时间。让我们先定义一个度量时间的类,它在本章中在衡量(和改进)模型性能时将非常有用。

#@save
class Benchmark:"""用于测量运行时间"""def __init__(self, description='Done'):self.description = descriptiondef __enter__(self):self.timer = d2l.Timer()return selfdef __exit__(self, *args):print(f'{self.description}: {self.timer.stop():.4f} sec')

现在我们可以调用网络两次,一次使用torchscript,一次不使用torchscript。

net = get_net()
with Benchmark('无torchscript'):for i in range(1000): net(x)net = torch.jit.script(net)
with Benchmark('有torchscript'):for i in range(1000): net(x)

输出结果:
无torchscript: 1.6907 sec
有torchscript: 1.6595 sec

如以上结果所示,在nn.Sequential的实例被函数torch.jit.script脚本化后,通过使用符号式编程提高了计算性能。

序列化

编译模型的好处之一是我们可以将模型及其参数序列化(保存)到磁盘。这允许这些训练好的模型部署到其他设备上,并且还能方便地使用其他前端编程语言。同时,通常编译模型的代码执行速度也比命令式编程更快。让我们看看save的实际功能。

net.save('my_mlp')
!ls -lh my_mlp*

输出结果:
-rw-rw-r--. 1 huida SharedUsers 652K May 6 14:12 my_mlp

小结

  • 命令式编程使得新模型的设计变得容易,因为可以依据控制流编写代码,并拥有相对成熟的Python软件生态。
  • 符号式编程要求我们先定义并且编译程序,然后再执行程序,其好处是提高了计算性能。

练习

  1. 回顾前几章中感兴趣的模型,能提高它们的计算性能吗?

解:
以LeNet模型为例,使用torch.jit.script函数可以提高其网络计算性能。
代码如下:

# LeNet
net = nn.Sequential(nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),nn.AvgPool2d(kernel_size=2, stride=2),nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),nn.AvgPool2d(kernel_size=2, stride=2),nn.Flatten(),nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),nn.Linear(120, 84), nn.Sigmoid(),nn.Linear(84, 10))X = torch.rand(size=(1, 1, 28, 28), dtype=torch.float32)with Benchmark('无torchscript'):for i in range(1000): net(X)net = torch.jit.script(net)
with Benchmark('有torchscript'):for i in range(1000): net(X)

输出结果:
无torchscript: 3.2212 sec
有torchscript: 2.8837 sec

相关文章:

动手学深度学习12.1. 编译器和解释器-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;无 本节教材地址&#xff1a;12.1. 编译器和解释器 — 动手学深度学习 2.0.0 documentation 本节…...

数字文明时代开源技术驱动的商业范式重构:基于开源AI大模型、AI智能名片与S2B2C商城小程序源码的协同创新研究

摘要&#xff1a;数字文明时代&#xff0c;数字技术正以指数级速度重构全球经济与社会结构。本文聚焦开源AI大模型、AI智能名片与S2B2C商城小程序源码的协同创新机制&#xff0c;从技术架构、商业逻辑、实践案例三个维度展开系统研究。基于多行业实证数据&#xff0c;揭示开源技…...

【Bootstrap V4系列】学习入门教程之 组件-轮播(Carousel)

Bootstrap V4系列 学习入门教程之 组件-轮播&#xff08;Carousel&#xff09; 轮播&#xff08;Carousel&#xff09;一、How it works二、Example2.1 Slides only 仅幻灯片2.2 With controls 带控制装置2.3 With indicators 带指示器2.4 With captions 带字幕 轮播&#xff0…...

嵌入式openharmony标准鸿蒙系统驱动开发基本原理与流程

第一:鸿蒙概述 OpenHarmony采用多内核(Linux内核或者LiteOS)设计,支持系统在不同资源容量的设备部署。当相同的硬件部署不同内核时,如何能够让设备驱动程序在不同内核间平滑迁移,消除驱动代码移植适配和维护的负担,是OpenHarmony驱动子系统需要解决的重要问题。 …...

Leetcode 刷题记录 08 —— 链表第二弹

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答&#xff0c;01~07为C语言&#xff0c;08及以后为Java语言。 01 合并两个有序链表 /*** Definition…...

PaddlePaddle 和PyTorch选择与对比互斥

你遇到的错误信息如下&#xff1a; RuntimeError: (PreconditionNotMet) Tensors dimension is out of bound.Tensors dimension must be equal or less than the size of its memory.But received Tensors dimension is 8, memorys size is 0.[Hint: Expected numel() * Size…...

极新月报·2025.4人工智能投融资观察

“ AI投资从‘量’向‘质’过渡 ” 4月重点关注&#xff1a; 1、四月人工智能领域投融资事件105起&#xff0c;披露金额78.63亿人民币。 2、亿级人民币以上金额的投资事件共20起 。 3、四月人工智能领域出现1起IPO事件。 4、在所有融资事件里&#xff0c;除去股权投资&…...

C++ vector 介绍与使用

目录 1.vector是什么&#xff1f; 2.vector的使用 2.1vector的构造函数 2.2vector iterator 的使用 2.3vector 空间增长问题 2.4vector的增删查改 1.vector是什么&#xff1f; 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也 采用连续的存储…...

可以下载blender/fbx格式模型网站

glbxz.com glbxz.com可以下载blender/fbx格式模型。当然里面有免费的...

Vi/Vim 编辑器详细指南

Vi/Vim 编辑器详细指南 简介一、模式详解1. 命令模式(Normal Mode)2. 插入模式(Insert Mode)3. 可视模式(Visual Mode)4. 命令行模式(Ex Mode)二、核心操作1. 保存与退出2. 导航与移动3. 编辑与文本操作4. 搜索与替换三、高级技巧1. 多文件与窗口操作2. 宏录制3. 寄存器…...

LeetCode 热题 100 22. 括号生成

LeetCode 热题 100 | 22. 括号生成 大家好&#xff0c;今天我们来解决一道经典的算法题——括号生成。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求生成所有可能的并且有效的括号组合。这是一道非常经典的回溯法题目&#xff0c;非常适合用来练习递归和回溯的技巧。…...

UE5 MetaHuman眼睛变黑

第5个材质MI_EyeOcclusion_Inst修改成透明即可...

【C语言】--指针超详解(一)

目录 一.内存和地址 1.1--内存 1.2--如何理解编址 二.指针变量和地址 2.1--取地址操作符(&) 2.2--指针变量和解引用操作符(*) 2.2.1--指针变量 2.2.2--如何理解指针类型 2.2.3--解引用操作符 2.3--指针变量的大小 三.指针变量类型的意义 3.1--从指针的解引用方…...

高频工业RFID读写器-三格电子

高频工业RFID读写器 型号&#xff1a;SG-HF40-485、SG-HF40-TCP 产品功能 高频工业读写器&#xff08;RFID&#xff09;产品用在自动化生产线,自动化分拣系统,零部件组装产线等情境下&#xff0c;在自动化节点的工位上部署RFID读写设备&#xff0c;通过与制品的交互&#xf…...

驱动开发系列57 - Linux Graphics QXL显卡驱动代码分析(四)显示区域绘制

一&#xff1a;概述 前面在介绍了显示模式设置&#xff08;分辨率&#xff0c;刷新率&#xff09;之后&#xff0c;本文继续分析下&#xff0c;显示区域的绘制&#xff0c;详细看看虚拟机的画面是如何由QXL显卡绘制出来的。 二&#xff1a;相关数据结构介绍 struct qxl_moni…...

6.5 行业特定应用:金融、医疗、制造等行业的定制化解决方案

金融、医疗和制造行业作为全球经济支柱&#xff0c;面临数据复杂性、实时性需求和严格合规性的共同挑战&#xff0c;同时各行业因业务特性衍生出独特需求。金融行业需应对市场波动、欺诈风险和多国法规&#xff0c;医疗行业聚焦精准诊断和患者数据隐私&#xff0c;制造业则强调…...

【Linux我做主】深入探讨从冯诺依曼体系到进程

从冯诺依曼体系到进程 从冯诺依曼体系到进程github地址1. 前言2. 计算机硬件2.1 冯诺依曼体系结构2.2 冯诺依曼模型的三大要点2.3 从QQ聊天认识&#xff1a;冯诺依曼体系下数据是如何流动的&#xff1f;发送方数据流动接收方数据流动 3. 计算机软件的根基——操作系统3.1 操作系…...

idea更换jdk版本操作

有时候我们有更换jdk版本的问题&#xff0c;自己电脑可能有多个版本&#xff0c;下面来介绍修改jdk版本修改修改什么地方 1 2 3 4 5 6 再修改pom即可&#xff0c;还有环境变量即可&#xff0c;希望有帮到大家&#xff01;...

npm install下载插件无法更新package.json和package-lock.json文件的解决办法

经过多番查证&#xff0c;使用npm config ls查看相关配置等方式&#xff0c;最后发现全局的.npmrc文件的配置多写了globaltrue&#xff0c;去掉就好了 如果参数很多&#xff0c;不知道是哪个参数引起的&#xff0c;先只保留registryhttp://xxx/&#xff0c;试试下载&#xff0…...

机器学习实操 第二部分 神经网路和深度学习 第13章 使用TensorFlow加载和预处理数据

机器学习实操 第二部分 神经网路和深度学习 第13章 使用TensorFlow加载和预处理数据 内容概要 第13章深入探讨了如何使用TensorFlow加载和预处理数据。本章首先介绍了tf.data API&#xff0c;它能够高效地加载和预处理大规模数据集&#xff0c;支持并行文件读取、数据打乱、批…...

WebSoket的简单使用

一、WebSocket简介 1.1、双向通信/全双工 客户端和服务器之间同时双向传输&#xff0c;全双工通信允许客户端和服务器随时互相发送消息&#xff0c;不需等一方发送请求后另一方才进行响应。 适用要低延迟/实时交互的场景&#xff0c;如在线游戏、即时通讯、股票行情等。 1.2…...

01_线性表

一、线性表的顺序存储 逻辑上相邻的数据元素&#xff0c;物理次序也相邻。占用连续存储空间&#xff0c;用“数组”实现&#xff0c;知道初始位置就可推出其他位置。 00_宏定义 // 函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #defin…...

STL详解 - map和set

目录 一、关联式容器概述 二、键值对 三、树形结构的关联式容器 &#xff08;一&#xff09;set 1. set的介绍 2. set的使用 &#xff08;1&#xff09;模板参数列表 &#xff08;2&#xff09;构造函数 &#xff08;3&#xff09;迭代器函数 &#xff08;4&#xff…...

SpringBoot 集成滑块验证码AJ-Captcha行为验证码 Redis分布式 接口限流 防爬虫

介绍 滑块验证码比传统的字符验证码更加直观和用户友好&#xff0c;能够很好防止爬虫获取数据。 AJ-Captcha行为验证码&#xff0c;包含滑动拼图、文字点选两种方式&#xff0c;UI支持弹出和嵌入两种方式。后端提供Java实现&#xff0c;前端提供了php、angular、html、vue、u…...

高并发PHP部署演进:从虚拟机到K8S的DevOps实践优化

一、虚拟机环境下的部署演进 1. 低并发场景&#xff08;QPS<10&#xff09;的简单模式 # 典型部署脚本示例 ssh userproduction "cd /var/www && git pull origin master" 技术痛点&#xff1a; 文件替换期间导致Nginx返回502错误&#xff08;统计显示…...

vue引入物理引擎matter.js

vue引入物理引擎matter.js 在 Vue 项目中集成 Matter.js 物理引擎的步骤如下: 1. 安装 Matter.js npm install matter-js # 或 yarn add matter-js2. 创建 Vue 组件 <template><div ref="physicsContainer" class="physics-container"><…...

【实战项目】简易版的 QQ 音乐:一

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;能自我实现简易版的 QQ 音乐。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a…...

部署Superset BI(三)连接HANA数据库

metabase和redash都不支持HANA数据库&#xff0c;选择superset就是看重这一点&#xff0c;开始尝试连接HANA数据库。 按Superset的技术文档&#xff1a;pip install hdbcli sqlalchemy-hana or pip install apache-superset[hana] --进入容器 rootNocobase:/usr/superset/supe…...

快速学会Linux的WEB服务

一.用户常用关于WEB的信息 什么是WWW www是world wide web的缩写&#xff0c;及万维网&#xff0c;也就是全球信息广播的意思 通常说的上网就是使用www来查询用户所需要的信息。 www可以结合文字、图形、影像以及声音等多媒体&#xff0c;超链接的方式将信息以Internet传递到世…...

如何搭建spark yarn模式集群的集群

以下是搭建 Spark YARN 模式集群的一般步骤&#xff1a; 准备工作 确保集群中各节点已安装并配置好 Java 环境&#xff0c;且版本符合 Spark 要求。规划好集群中节点的角色&#xff0c;如 Master 节点、Worker 节点等&#xff0c;并确保各节点之间网络畅通&#xff0c;能相互…...

端口安全基本配置

1.top图 2.交换机配置 交换机swa <SWA> system-view [SWA] vlan batch 10 20[SWA] interface GigabitEthernet0/0/1 [SWA-GigabitEthernet0/0/1] port link-type trunk [SWA-GigabitEthernet0/0/1] port trunk allow-pass vlan 10[SWA] interface GigabitEthernet0/0/2 …...

【JsonCpp、Muduo、C++11】JsonCpp库、Muduo库、C++11异步操作

JsonCpp库、Muduo库、C11异步操作 1. JsonCpp库1.1 Json数据格式1.2 JsonCpp介绍1.3 JsonCpp使用 2. Muduo库2.1 Muduo库常见接口介绍2.1.1 TcpServer类基础介绍2.1.2 EventLoop类基础介绍2.1.3 TcpConnection类基础介绍2.1.4 Buffer类基础介绍2.1.5 TcpClient类基础介绍 2.2 M…...

【自然语言处理与大模型】LlamaIndex的词嵌入模型和向量数据库

&#xff08;1&#xff09;嵌入模型的定义和作用 嵌入模型&#xff08;Embedding Model&#xff09;的本质在于将高维的、稀疏的数据转换为低维的、密集的向量表示&#xff0c;使得这些向量能够在数学空间中表达原始数据的语义信息。作用如下&#xff1a; 降维表示&#xff1a;…...

SLAM算法工程师面经大全:2025年面试真题解析与实战指南

SLAM算法工程师面经大全&#xff1a;2025年面试真题解析与实战指南 一、SLAM技术概述与核心原理 1&#xff0e;SLAM基础理论框架 SLAM算法的核心在于同步定位与建图&#xff0c;这一过程涉及传感器数据融合、运动建模与优化方法。在传感器数据融合方面&#xff0c;不同类型的…...

虚拟现实视频播放器 2.6.1 | 支持多种VR格式,提供沉浸式观看体验的媒体播放器

虚拟现实媒体播放器是一款专为在智能手机上播放VR&#xff08;虚拟现实&#xff09;照片和视频而设计的应用程序。它支持多种格式的影像内容&#xff0c;包括360和180等距矩形柱面、标准镜头和鱼眼镜头拍摄的照片和视频&#xff0c;并且兼容3D立体并排、上/下以及收缩媒体格式。…...

从黔西游船侧翻事件看极端天气预警的科技防线——疾风气象大模型如何实现精准防御?

近日,贵州省黔西市一起载人游船侧翻事故令人痛心。调查显示,事发时当地突遇强风暴雨,水面突发巨浪导致船只失控。这一事件再次凸显:在极端天气频发的时代,传统“经验式防灾”已不足够,唯有依靠智能化的气象预警技术,才能筑牢安全底线。 极端天气预警的痛点:为什么传统方…...

颠覆监测体验!WM102无线温湿度记录仪开启智能物联新时代

当温湿度失控成为企业隐形成本杀手&#xff0c;您是否还在用传统设备疲于应对&#xff1f;一款集智能、精准、全能于一身的神器横空出世——WM102无线温湿度记录仪&#xff0c;用硬核科技重新定义环境监测&#xff01; ▌5大场景痛点 一招破解 无论是医药冷库里的疫苗守护战&am…...

Linux云服务器配置git开发环境

文章目录 1. 安装 git2. git clone3. git add .4. git commit -m 提交记录5. git push&#x1f351; 异常原因&#x1f351; 解决办法 6. git pull7. git log8. git rm9. git mv10. git status 1. 安装 git sudo yum install git -y2. git clone 此命令的作用是从远程仓库把代…...

山东大学软件学院项目实训-基于大模型的模拟面试系统-个人主页头像上传

采用图床的方案&#xff0c;存储用户头像。 实现步骤 引入OSS依赖 在我们的SpringBoot项目中引入OSS依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version> &l…...

AI智能体|扣子(Coze)实战【天气查询插件开发教程】

大家好&#xff0c;我是偶然&#xff0c;AI洞察&#xff0c;AI智能体&#xff0c;AI实战案例分享 今天教大家用 Coze 开发一个天气插件&#xff0c;本来我是想教大家怎么用 AI 写代码节点实现节点功能的&#xff0c;但是我感觉太复杂了。 起码来说&#xff0c;我还没做到用特别…...

VBA ListBox/ComboBox 响应鼠标滚轮操作

一般情况下&#xff0c;在Excel的vba窗口中&#xff0c;我们是无法使用鼠标滚轮控制例如 ListBox 和 ComboBox 控件的。我们只能通过鼠标点击的方式来逐个选择选项。 我们都知道&#xff0c;通过鼠标滚轮快速的上下滚动候选项&#xff0c;以快速的定位选择选项&#xff0c;这是…...

Linux 更改内存交换 swap 为 zram 压缩,减小磁盘写入

1、查看当前 swap 的方式 swapon --show 我这里是默认的 swap 文件&#xff0c;大小为 2G。 2、安装 zram Ubuntu 下&#xff1a; sudo apt install zram-tools安装后默认会启动&#xff1a; 3、关闭默认的 swap 文件 sudo swapoff /swapfile 其次是关闭 /etc/fstab 中的 …...

TypeScript简介

&#x1f31f; TypeScript入门 TypeScript 是 JavaScript 的超集&#xff0c;由微软开发并维护&#xff0c;通过静态类型检查和现代语言特性&#xff0c;让大型应用开发变得更加可靠和高效。 // 一个简单的 TypeScript 示例 interface User {name: string;age: number;greet():…...

Facebook如何运用AI实现元宇宙的无限可能?

引言 元宇宙&#xff08;Metaverse&#xff09;是一个虚拟的、由多个 3D 虚拟世界组成的网络&#xff0c;用户可以在其中进行互动、游戏、工作和社交。Facebook 作为全球最大的社交媒体平台之一&#xff0c;对元宇宙的构建和实现有着深远的影响。通过运用人工智能&#xff08;…...

【大语言模型ChatGPT+Python】近红外光谱数据分析及机器学习与深度学习建模(近红外光谱数据分析、定性/定量分析模型代码自动生成等)

近红外光谱数据分析是一种重要的分析技术&#xff0c;广泛应用于化学、食品、制药、农业、环境科学等领域。以下是关于近红外光谱数据分析的详细介绍&#xff1a; 一、基本原理 近红外光谱的范围 近红外光谱是指波长范围在780 - 2500纳米的电磁辐射。在这个波段&#xff0c;分子…...

ArcGIS Pro图斑属性自动联动更新-在线卫星底图图斑采集

今天介绍一下在ArcGIS Pro图斑属性自动联动更新 主要介绍内容&#xff1a; 1、ArcGIS Pro数据设计中属性规则的设置&#xff0c;实现图斑属性的自动更新与联动更新。 2、介绍ArcGIS Pro不能新建要素类图层的原因 3、包括新建字段等内容 4、deepseek查询arcade计算图斑面积语…...

OpenHarmony GPIO应用开发-LED

学习于&#xff1a; https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/driver/driver-platform-gpio-develop.md https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/driver/driver-platform-gpio-des.md 通过OpenHarmony官方文档指导可获知&#xff1a;芯片厂…...

C语言结构体内存对齐使用场景

#pragma pack(push, 1) 和 #pragma pack(pop) 的使用场景&#xff08;C语言&#xff09; 这两个预处理指令用于控制结构体成员的内存对齐方式&#xff0c;主要在以下场景中使用&#xff1a; 主要使用场景 网络通信协议处理 当需要精确控制结构体布局以匹配网络协议格式时 确…...

极速轻量,Rust 网络开发新选择:Hyperlane 框架深度解析

极速轻量&#xff0c;Rust 网络开发新选择&#xff1a;Hyperlane 框架深度解析 在高性能网络服务开发领域&#xff0c;Rust 凭借其内存安全与高效并发的特性备受青睐。今天&#xff0c;我们迎来一款专为现代 Web 服务打造的明星框架——Hyperlane&#xff0c;它以“轻量高效、…...

从零开始学习人工智能(Python高级教程)Day6-Python3 正则表达式

一、Python3 正则表达式 正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与某种模式匹配。 在 Python 中&#xff0c;使用 re 模块来处理正则表达式。 re 模块提供了一组函数&#xff0c;允许你在字符串中进行模式匹配、搜索和替换操作。 r…...