使用LSTM完成时间序列预测
c
在本教程中,我们将介绍一个简单的示例,旨在帮助初学者入门时间序列预测和 PyTorch 的使用。通过这个示例,你可以学习如何使用 LSTMCell 单元来处理时间序列数据。
我们将使用两个 LSTMCell 单元来学习从不同相位开始的正弦波信号。模型在学习了这些正弦波之后,将尝试预测未来的信号值。
使用方法
-
生成正弦波信号:
python generate_sine_wave.py
-
训练模型:
python train.py
生成正弦波训练数据
在这一步中,我们将生成用于训练的正弦波信号数据。以下是代码及其详细解释:
import numpy as np
import torch# 设置随机种子,以确保结果的可重复性
np.random.seed(2)# 定义常数 T、L 和 N
T = 20
L = 1000
N = 100# 创建一个空的 numpy 数组 x,用于存储生成的序列
x = np.empty((N, L), 'int64')# 为数组 x 赋值,每行都是一个按顺序排列的整数序列,
# 并加入了一个随机偏移量
x[:] = np.array(range(L)) + np.random.randint(-4 * T, 4 * T, N).reshape(N, 1)# 对 x 进行正弦变换,以此生成正弦波数据
data = np.sin(x / 1.0 / T).astype('float64')# 将生成的正弦波数据保存为一种 PyTorch 可读的格式
torch.save(data, open('traindata.pt', 'wb'))
代码解析
- 导入库
numpy
:用于数值计算torch
:用于深度学习中的数据处理和模型训练
- 设置随机种子
- 通过
np.random.seed(2)
设置随机种子,以保证每次运行代码时生成相同的随机数,从而使结果可重复。
- 定义常量
T
:周期长度L
:每行的序列长度N
:生成的样本数量
- 生成随机序列
- 创建一个空的 numpy 数组
x
,用于存储生成的整数序列。 - 对数组
x
进行赋值,每一行是一个按顺序排列的整数序列,加上一个随机的偏移量。偏移量的范围由np.random.randint(-4 * T, 4 * T, N).reshape(N, 1)
确定。
- 生成正弦波数据
- 对
x
进行正弦变换,生成标准的正弦波数据。np.sin(x / 1.0 / T).astype('float64')
将整数序列转换为浮点数序列,并进行正弦变换。
- 保存数据
- 使用
torch.save
将生成的正弦波数据保存为traindata.pt
,方便后续训练时加载使用。
搭建与训练时间序列预测模型
在本教程中,我们将详细讲解如何使用 PyTorch 搭建一个LSTM模型,进行时间序列预测。以下是代码及其逐行解释,我们将整个过程分为三个部分:模型定义、数据加载与预处理,以及模型训练与预测。
模型定义
首先,我们定义一个 LSTM 模型,该模型包含两个 LSTMCell 层和一个全连接层用于输出。
from __future__ import print_function
import argparse
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt# 定义一个序列模型
class Sequence(nn.Module):def __init__(self):super(Sequence, self).__init__()# 定义两个LSTMCell层和一个全连接层self.lstm1 = nn.LSTMCell(1, 51)self.lstm2 = nn.LSTMCell(51, 51)self.linear = nn.Linear(51, 1)# 定义前向传播def forward(self, input, future = 0):outputs = []# 初始化LSTMCell的隐藏状态和细胞状态h_t = torch.zeros(input.size(0), 51, dtype=torch.double)c_t = torch.zeros(input.size(0), 51, dtype=torch.double)h_t2 = torch.zeros(input.size(0), 51, dtype=torch.double)c_t2 = torch.zeros(input.size(0), 51, dtype=torch.double)# 遍历输入序列for input_t in input.split(1, dim=1):# 更新LSTMCell的隐藏状态和细胞状态h_t, c_t = self.lstm1(input_t, (h_t, c_t))h_t2, c_t2 = self.lstm2(h_t, (h_t2, c_t2))# 通过全连接层得到输出output = self.linear(h_t2)outputs += [output]# 如果需要预测未来值for i in range(future):h_t, c_t = self.lstm1(output, (h_t, c_t))h_t2, c_t2 = self.lstm2(h_t, (h_t2, c_t2))output = self.linear(h_t2)outputs += [output]# 将输出序列拼接起来outputs = torch.cat(outputs, dim=1)return outputs
这段代码是一个简单的序列模型,包括两个LSTMCell层和一个全连接层。它接受一个输入序列,通过LSTMCell层和全连接层对输入进行处理,最终输出一个序列。如果需要预测未来值,则可以在forward函数中传入future参数来进行预测。
具体解释如下:
- 首先导入必要的库,包括torch、torch.nn等。
- 定义了一个名为Sequence的序列模型,继承自nn.Module。
- 在初始化函数中,定义了两个LSTMCell层和一个全连接层,分别是lstm1、lstm2和linear。
- forward函数用来定义模型的前向传播过程,接受输入input和可选的future参数,返回处理后的输出序列。
- 在forward函数中,首先初始化了LSTMCell的隐藏状态和细胞状态h_t、c_t、h_t2、c_t2。
- 遍历输入序列input,对每个输入进行处理,更新LSTMCell的隐藏状态和细胞状态,通过全连接层得到输出,并将输出保存在outputs列表中。
- 如果future参数大于0,表示需要预测未来值,进入一个for循环,通过当前输出不断更新LSTMCell的状态,并将预测得到的输出保存在outputs中。
- 最后将所有输出序列拼接起来,返回最终的输出。
这段代码主要实现了对输入序列的处理和未来值的预测,是一个简单的序列预测模型。
数据加载与预处理
接下来,我们加载生成的训练数据,并构建训练集和测试集。
if __name__ == '__main__':# 定义命令行参数parser = argparse.ArgumentParser()parser.add_argument('--steps', type=int, default=15, help='steps to run')opt = parser.parse_args()# 设置随机种子np.random.seed(0)torch.manual_seed(0)# 加载数据并构建训练集data = torch.load('traindata.pt')input = torch.from_numpy(data[3:, :-1])target = torch.from_numpy(data[3:, 1:])test_input = torch.from_numpy(data[:3, :-1])test_target = torch.from_numpy(data[:3, 1:])
这段代码是一个Python脚本的入口点,通常用于定义和设置命令行参数,加载数据,并准备训练数据。让我逐行解释:
-
if __name__ == '__main__':
这是Python中用来判断是否当前脚本被当做程序入口执行的一种常见方式。如果当前脚本被当做主程序执行,而不是被其他模块导入,这个条件会成立。 -
parser = argparse.ArgumentParser()
创建了一个命令行参数解析器。 -
parser.add_argument('--steps', type=int, default=15, help='steps to run')
定义了一个名为steps
的命令行参数,指定了参数的类型为整数,默认值为15,以及参数的帮助信息。 -
opt = parser.parse_args()
解析命令行参数,并将结果存储在opt
变量中。 -
np.random.seed(0)
和torch.manual_seed(0)
设置了随机数生成器的种子,用于确保实验结果的可复现性。 -
data = torch.load('traindata.pt')
从名为traindata.pt
的文件中加载数据。 -
input = torch.from_numpy(data[3:, :-1])
创建了一个PyTorch张量input
,用于存储数据中第4列到倒数第2列之间的数据。 -
target = torch.from_numpy(data[3:, 1:])
创建了一个PyTorch张量target
,用于存储数据中第4列到最后一列之间的数据。 -
test_input = torch.from_numpy(data[:3, :-1])
创建了一个PyTorch张量test_input
,用于存储数据中第1列到倒数第2列之间的数据,这是用于测试的输入数据。 -
test_target = torch.from_numpy(data[:3, 1:])
创建了一个PyTorch张量test_target
,用于存储数据中第2列到最后一列之间的数据,这是用于测试的目标数据。
这段代码的主要作用是准备数据,设置随机种子和命令行参数,为后续的数据处理和模型训练做准备。
模型训练与预测
最后,我们进行模型训练并进行预测。
# 构建模型seq = Sequence()seq.double()criterion = nn.MSELoss()# 使用LBFGS作为优化器,因为我们可以将所有数据加载到训练中optimizer = optim.LBFGS(seq.parameters(), lr=0.8)# 开始训练for i in range(opt.steps):print('STEP: ', i)def closure():optimizer.zero_grad()out = seq(input)loss = criterion(out, target)print('loss:', loss.item())loss.backward()return lossoptimizer.step(closure)# 开始预测,不需要跟踪梯度with torch.no_grad():future = 1000pred = seq(test_input, future=future)loss = criterion(pred[:, :-future], test_target)print('test loss:', loss.item())y = pred.detach().numpy()# 绘制结果plt.figure(figsize=(30,10))plt.title('Predict future values for time sequences\n(Dashlines are predicted values)', fontsize=30)plt.xlabel('x', fontsize=20)plt.ylabel('y', fontsize=20)plt.xticks(fontsize=20)plt.yticks(fontsize=20)def draw(yi, color):plt.plot(np.arange(input.size(1)), yi[:input.size(1)], color, linewidth = 2.0)plt.plot(np.arange(input.size(1), input.size(1) + future), yi[input.size(1):], color + ':', linewidth = 2.0)draw(y[0], 'r')draw(y[1], 'g')draw(y[2], 'b')plt.savefig('predict%d.pdf'%i)plt.close()
这段代码是一个简单的 PyTorch 深度学习模型训练和预测的示例。让我为您解释一下代码的主要部分:
-
首先,代码创建了一个名为 “seq” 的序列模型。然后转换这个模型为双精度数据类型。接着定义了均方误差损失函数 “criterion”。LBFGS 作为优化器,学习速率为 0.8。
-
在训练过程中,通过一个循环来进行多次优化迭代。在每次迭代中,通过闭包函数 “closure()” 来计算损失并执行反向传播,然后优化器根据损失进行参数更新。
-
接着,使用 torch.no_grad() 上下文管理器来禁止跟踪梯度,开始进行预测。在这里,预测未来的 1000 个时间步。然后计算预测结果和测试目标之间的损失,并打印损失值。
-
接下来是绘制结果的部分。代码会使用 matplotlib 库绘制预测的结果图。其中,将实线用于已知的数据部分,虚线用于预测的数据部分。最后,结果图被保存为名为 ‘predict%d.pdf’ 的文件,其中 %d 是迭代的次数。
在GPU上运行
这段代码的默认配置是使用CPU进行训练和预测。如果你想利用GPU加速训练过程,可以通过以下步骤修改代码将模型和数据放到GPU上进行计算。
以下是针对GPU的修改:
- 检查是否有可用的GPU:一般使用
torch.cuda.is_available()
来检查是否有可用的GPU。 - 将模型和数据移动到GPU:将数据和模型移动到GPU设备上进行计算。
所有涉及到数据和模型的地方都需要做相应的改动,使其可以在GPU上执行。
以下是修改后的代码:
from __future__ import print_function
import argparse
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt# 定义一个序列模型
class Sequence(nn.Module):def __init__(self):super(Sequence, self).__init__()# 定义两个LSTMCell层和一个全连接层self.lstm1 = nn.LSTMCell(1, 51)self.lstm2 = nn.LSTMCell(51, 51)self.linear = nn.Linear(51, 1)# 定义前向传播def forward(self, input, future = 0):outputs = []# 初始化LSTMCell的隐藏状态和细胞状态h_t = torch.zeros(input.size(0), 51, dtype=input.dtype, device=input.device)c_t = torch.zeros(input.size(0), 51, dtype=input.dtype, device=input.device)h_t2 = torch.zeros(input.size(0), 51, dtype=input.dtype, device=input.device)c_t2 = torch.zeros(input.size(0), 51, dtype=input.dtype, device=input.device)# 遍历输入序列for input_t in input.split(1, dim=1):# 更新LSTMCell的隐藏状态和细胞状态h_t, c_t = self.lstm1(input_t, (h_t, c_t))h_t2, c_t2 = self.lstm2(h_t, (h_t2, c_t2))# 通过全连接层得到输出output = self.linear(h_t2)outputs += [output]# 如果需要预测未来值for i in range(future):h_t, c_t = self.lstm1(output, (h_t, c_t))h_t2, c_t2 = self.lstm2(h_t, (h_t2, c_t2))output = self.linear(h_t2)outputs += [output]# 将输出序列拼接起来outputs = torch.cat(outputs, dim=1)return outputsif __name__ == '__main__':# 定义命令行参数parser = argparse.ArgumentParser()parser.add_argument('--steps', type=int, default=15, help='steps to run')opt = parser.parse_args()# 设置随机种子np.random.seed(0)torch.manual_seed(0)# 检查是否有可用的GPUdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 加载数据并构建训练集data = torch.load('traindata.pt')input = torch.from_numpy(data[3:, :-1]).double().to(device)target = torch.from_numpy(data[3:, 1:]).double().to(device)test_input = torch.from_numpy(data[:3, :-1]).double().to(device)test_target = torch.from_numpy(data[:3, 1:]).double().to(device)# 构建模型seq = Sequence().double().to(device)criterion = nn.MSELoss()# 使用LBFGS作为优化器,因为我们可以将所有数据加载到训练中optimizer = optim.LBFGS(seq.parameters(), lr=0.8)# 开始训练for i in range(opt.steps):print('STEP: ', i)def closure():optimizer.zero_grad()out = seq(input)loss = criterion(out, target)print('loss:', loss.item())loss.backward()return lossoptimizer.step(closure)# 开始预测,不需要跟踪梯度with torch.no_grad():future = 1000pred = seq(test_input, future=future)loss = criterion(pred[:, :-future], test_target)print('test loss:', loss.item())y = pred.detach().cpu().numpy() # 将结果移回CPU以便绘图# 绘制结果plt.figure(figsize=(30,10))plt.title('Predict future values for time sequences\n(Dashlines are predicted values)', fontsize=30)plt.xlabel('x', fontsize=20)plt.ylabel('y', fontsize=20)plt.xticks(fontsize=20)plt.yticks(fontsize=20)def draw(yi, color):plt.plot(np.arange(input.size(1)), yi[:input.size(1)], color, linewidth = 2.0)plt.plot(np.arange(input.size(1), input.size(1) + future), yi[input.size(1):], color + ':', linewidth = 2.0)draw(y[0], 'r')draw(y[1], 'g')draw(y[2], 'b')plt.savefig('predict%d.pdf'%i)plt.close()
修改解释
-
检查GPU:
- 使用
torch.cuda.is_available()
检查是否有可用的GPU。如果有,将device
设置为cuda
,否则为cpu
。
- 使用
-
数据和模型移到GPU:
- 使用
.to(device)
方法将数据和模型移到指定设备(CPU或GPU)。 - 初始化隐藏状态和细胞状态时,指定相应的设备
device
和数据类型dtype
。
- 使用
-
绘图前将数据移回CPU:
- 由于
matplotlib
需要在 CPU 上的 numpy 数组,因此在绘图前将预测数据移回 CPU,并调用.detach().cpu().numpy()
。
- 由于
通过这些修改,你可以利用GPU来加速模型训练过程。当然,前提是你的计算机上配备了兼容的GPU。如果没有,代码将自动退回到使用CPU进行训练。
可以看到GPU明显上升
结果
STEP: 0
loss: 0.5023738122475573
loss: 0.4985663937943564
loss: 0.479011960611529
loss: 0.44633490214842303
loss: 0.35406310257493023
loss: 0.2050701661768143
loss: 1.3960531561166554
loss: 0.03249441148471743
...
test loss: 6.382565835674331e-06
STEP: 13
loss: 3.76246839739177e-06
test loss: 6.382565835674331e-06
STEP: 14
loss: 3.76246839739177e-06
test loss: 6.382565835674331e-06
得到图像:
第1次训练后:
第5次训练后:
第10次:
第15次:
相关文章:

使用LSTM完成时间序列预测
c 在本教程中,我们将介绍一个简单的示例,旨在帮助初学者入门时间序列预测和 PyTorch 的使用。通过这个示例,你可以学习如何使用 LSTMCell 单元来处理时间序列数据。 我们将使用两个 LSTMCell 单元来学习从不同相位开始的正弦波信号。模型在…...

《数据结构:顺序实现二叉树》
文章目录 一、树1、树的结构与概念2、树相关术语 二、二叉树1、概念与结构2、满二叉树3、完全二叉树 三、顺序二叉树存储结构四、实现顺序结构二叉树1、堆的概念与结构2、堆的实现3、堆的排序 一、树 1、树的结构与概念 树是一种非线性的数据结构,它是由nÿ…...

【HarmonyOS】HarmonyOS NEXT学习日记:六、渲染控制、样式结构重用
【HarmonyOS】HarmonyOS NEXT学习日记:六、渲染控制、样式&结构重用 渲染控制包含了条件渲染和循环渲染,所谓条件渲染,即更具状态不同,选择性的渲染不同的组件。 而循环渲染则是用于列表之内的、多个重复元素组成的结构中。 …...

【防火墙】防火墙NAT、智能选路综合实验
实验拓扑 实验要求 7,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 8,分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9,多出口环境基于带宽比例进行选路…...

VUE之---slot插槽
什么是插槽 slot 【插槽】, 是 Vue 的内容分发机制, 组件内部的模板引擎使用slot 元素作为承载分发内容的出口。slot 是子组件的一个模板标签元素, 而这一个标签元素是否显示, 以及怎么显示是由父组件决定的。 VUE中slot【插槽】…...

linux、windows、macos,命令终端清屏
文章目录 LinuxWindowsmacOS 在Linux、Windows和macOS的命令终端中,清屏的命令或方法各不相同。以下是针对这三种系统的清屏方法: Linux clear命令:这是最常用的清空终端屏幕的命令之一。在终端中输入clear命令后,屏幕上的所有内容…...

【RaspberryPi】树莓派Matlab/Simulink支持包安装与使用
官网支持与兼容性 Raspberry Pi Support from MATLAB - Hardware Support - MATLAB & Simulink Raspberry Pi Support from Simulink - Hardware Support - MATLAB & Simulink Matlab与树莓派兼容性 Simulink与树莓派兼容性 树莓派Matlab&Simulink RaspberryPi支…...

嵌入式人工智能(10-基于树莓派4B的DS1302实时时钟RTC)
1、实时时钟(Real Time Clock) RTC,全称为实时时钟(Real Time Clock),是一种能够提供实时时间信息的电子设备。RTC通常包括一个计时器和一个能够记录日期和时间的电池。它可以独立于主控芯片工作ÿ…...

C++ | Leetcode C++题解之第275题H指数II
题目: 题解: class Solution { public:int hIndex(vector<int>& citations) {int n citations.size();int left 0, right n - 1;while (left < right) {int mid left (right - left) / 2;if (citations[mid] > n - mid) {right m…...
编写DockerFile
将自己的项目或者环境通过Docker部署到服务器需要一下几个步骤: 打包项目或者环境 编写Dockerfile文件 运行Dockerfile文件,构建DockerImages镜像,将DockerImages存入DockerHub或者存入阿里云镜像仓库 服务器pull下DockerImages镜像&#…...

TCP并发服务器多线程
1.创建线程‐‐pthread_create int pthread_create( pthread_t *thread, // 线程 ID 无符号长整型 const pthread_attr_t *attr, // 线程属性, NULL void *(*start_routine)(void *), // 线程处理函数 void *arg); // 线程处理函数 参数: pthrea…...
技术速递|C# 13:探索最新的预览功能
作者:Kathleen Dollard 排版:Alan Wang C# 13 已初具雏形,其新特性侧重于灵活性、性能以及使您最喜欢的功能在日常中变得更容易使用。我们以公开的方式构建 C#,在今年的 Microsoft Build 大会上,我们会让您一睹 C# 13 …...

Python设计模式:巧用元类创建单例模式!
✨ 内容: 今天我们来探讨一个高级且实用的Python概念——元类(Metaclasses)。元类是创建类的类,它们可以用来控制类的行为。通过本次练习,我们将学习如何使用元类来实现单例模式,确保某个类在整个程序中只…...

构建自主可控的工业操作系统,筑牢我国工业安全堡垒
构建自主可控的工业操作系统,筑牢我国工业安全堡垒,鸿道(Intewell)操作系统为国家工业发展保驾护航。 7月19日,全球多地安装微软操作系统的电脑设备出现大规模宕机,导致“蓝屏”现象,严重影响了航空、铁路、医疗、金…...

WPF串口通讯程序
目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using HardwareCommunications; using System.IO.Ports; using System.Windows;namespace PortTest {/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainW…...

汽车技术智能化程度不断提升,线束可靠性如何设计?
随着汽车技术的高速发展,汽车自动化、智能化程度的逐步提高,人们对汽车的安全性、舒适性、娱乐性等要求也不断提高,加上汽车节能减排法规的不断严峻,整车电气设备不断增加,作为连接汽车各种电器设备“神经网络”的整车…...

实现Nginx的反向代理和负载均衡
一、反向代理和负载均衡简介 1.1、反向代理 反向代理(reverse proxy)指:以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端。此时代理服务器对外就表现为一个反向代理服务器。 反向代…...
【算法】子集
难度:中等 题目: 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的 子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,…...

Web前端:HTML篇(一)
HTML简介: 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。 您可以使用 HTML 来建立自己的 WEB 站点,HTML 运行在浏览器上,由浏览器…...
ActiViz中的选择点vtkWorldPointPicker
文章目录 1. vtkWorldPointPicker简介2. 类的位置和继承关系3. 选择机制4. 返回的信息5. 选择的条件和参数6. 与屏幕空间选择器的比较7. 性能特征8. 应用场景9. 与其他vtk选择器的集成10. 完整示例总结1. vtkWorldPointPicker简介 vtkWorldPointPicker是Visualization Toolkit…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...