PyTorch深度学习实战(1)——PyTorch安装与配置

news2024/12/23 23:33:56

本章共有两节,2.1节介绍如何安装PyTorch,以及如何配置学习环境;2.2节带领读者快速浏览PyTorch中的主要内容,帮助读者初步了解PyTorch。

PyTorch是一款以C语言为主导开发的轻量级深度学习框架,它提供了丰富的Python接口以便用户使用。在使用PyTorch之前,读者需要安装Python环境以及pip包管理工具,笔者推荐使用Anaconda配置相关虚拟环境。本书中的所有代码均使用PyTorch 1.8版本,在Python3环境中运行得到最终结果。此外,本书默认使用Linux作为开发环境。

为了方便用户安装使用,PyTorch官方提供了多种安装方法。本节将介绍几种常用的安装方式,读者可以根据自己的需求选用。

1 在Linux系统下安装PyTorch

1.1使用pip安装

目前,使用pip安装PyTorch二进制包是最简单、最不容易出错,同时也是最适合新手的安装方式。读者可以从PyTorch官网选择操作系统、包管理器、编程语言及CUDA版本,从而得到对应的安装命令,如图2-1所示。

以Linux平台、pip包管理器、PyTorch 1.8及CUDA 10.2为例,安装命令如下:

pip install torch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0

待全部安装完成后,打开Python,运行如下命令:

import torch as t

如果上述命令没有报错,那么表示PyTorch安装成功。在安装PyTorch时,读者需要注意以下两点。

  • PyTorch对应的Python包名是torch,而非pytorch。
  • 如果需要使用GPU版本的PyTorch,那么需要先安装英伟达显卡驱动,再安装PyTorch。

1.2使用conda安装

conda是Anaconda自带的包管理器,如果读者使用Anaconda作为Python环境,那么除了使用pip安装PyTorch,还可以使用conda进行安装。同样,读者可以从PyTorch官网选择对应的操作系统、包管理器、编程语言及CUDA版本,从而得到对应的安装命令,如图2-2所示。

以Linux平台、conda包管理器、PyTorch 1.8及CUDA 10.2为例,安装命令如下:

conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=10.2 -c pytorch

其中,-c pytorch表示从官网下载安装,速度可能较慢。因此,可以将conda源更换为清华镜像源,读者可自行搜索更换方法。在配置完清华镜像源后就可以去掉-c pytorch命令,从而较快地通过conda完成PyTorch的安装。

注意:PyTorch在安装包中已经集成了CUDA相关的二进制文件,因此CUDA版本可以和系统的CUDA版本不一致,具体可以参考8.2节。另外,读者也可以选择只支持CPU的版本,或者还处在测试阶段的AMD GPU版本(ROCm)。

2 在Windows系统下安装PyTorch

1.1使用pip安装

对于PyTorch 1.8,官网提供了基于包管理器pip的安装方法。同样,选择操作系统、包管理器pip,编程语言以及CUDA版本,就可以得到对应的安装命令,如图2-3所示。

1.2使用conda安装

与在Linux系统下的安装类似,进行相应选择后,官网提供的命令界面如图2-4所示。

为了加快安装的速度,用户可以配置清华镜像源,读者可自行搜索配置方法。在配置完清华镜像源后就可以去掉-c pytorch,从而较快地通过conda完成PyTorch的安装。

3 学习工具介绍

工欲善其事,必先利其器。在从事科学计算相关工作时,IPython和Jupyter Notebook是两个重要的工具,笔者推荐使用IPython或者Jupyter Notebook来学习本书的示例代码。类似的开发工具还有PyCharm以及Visual Studio Code(VS Code)。笔者认为,Jupyter Notebook中聚合了网页与可视化的功能,十分便捷易用;PyCharm更全面但也更复杂,更适合一些大规模项目的开发,它的较多功能需要使用付费的专业版;VS Code的生态环境已经十分成熟,它提供了许多易用的插件以提升用户的体验感。因此,本节将向读者介绍VS Code、IPython以及Jupyter Notebook的安装与使用方法。

3.1 Visual Studio Code

VS Code是一款由微软开发的免费且开源的编辑器,它支持所有主流的开发语言。VS Code适合用户进行远程开发,它支持SSH传输协议,可用于连接远程服务器。同时,VS Code提供了十分丰富的插件,来提高用户的开发效率,例如Python(用于代码调试、变量检测等)、Remote-SSH(用于连接远程服务器)、Jupyter(用于加载Jupyter Notebook)等。

VS Code可在其官网上直接下载,目前支持Windows、Linux以及macOS系统。在成功安装VS Code后,读者可以通过左侧菜单栏中的扩展页面(快捷键"Ctrl+Shift+X")下载相关插件,如图2-5所示。

安装Python插件以及Jupyter插件后,读者可以直接使用VS Code打开.py.ipynb文件,在VS Code中使用Jupyter Notebook的界面如图2-6所示。VS Code提供了自动补全、悬停提示等多种实用的功能,十分适合Python入门者进行后续学习。

3.2 IPython

IPython是一个交互式计算系统,可以认为是增强版的Python Shell,它提供了强大的REPL(交互式解析器)功能。对于从事科学计算的用户来说,IPython提供了方便的可交互式学习以及调试功能。

安装IPython十分简单,读者可以通过以下命令安装IPython:

pip install ipython

安装完成后,在命令行输入ipython即可启动IPython,启动界面如下:

Python 3.6.13 | packaged by conda-forge | (default, Feb 19 2021, 05:36:01) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.16.1 -- An enhanced Interactive Python. Type '?' for help.
 
In [1]: import torch as t

输入exit命令或者按下“Ctrl+D”快捷键即可退出IPython。IPython有许多强大的功能,其中最常用的功能如下。

自动补全 IPython最方便的功能之一是自动补全,输入一个函数或者变量的前几个字母,按下“Tab”键,就能实现自动补全,如图2-7所示。

内省 内省是指在程序运行时获得一个对象的全部类型信息,这对实际学习有很大帮助。例如,在某个函数或者模块之后,接着输入?可以查看它对应的帮助文档。有些帮助文档比较长,可能跨页,这时可按空格键翻页,输入q退出,示例如下:

In [1]: import torch as t
 
In [2]: t.abs?
Docstring:
abs(input, out=None) -> Tensor
 
Computes the element-wise absolute value of the given :attr:`input` tensor.
 
.. math::
    \text{out}_{i} = |\text{input}_{i}|
 
Args:
    input (Tensor): the input tensor.
    out (Tensor, optional): the output tensor.
 
Example::
 
    >>> torch.abs(torch.tensor([-1, -2, 3]))
    tensor([ 1,  2,  3])
Type:      builtin_function_or_method

在函数或模块名之后输入两个问号,例如,torch.nn.L1Loss??可以查看这个对象的源码。注意,此处的源码是Python对应的源码,无法查看C/C++的源码。

快捷键 IPython提供了很多快捷键。例如,按上箭头可以重新输入上一条代码;一直按上箭头,可以追溯到之前输入的代码。按"Ctrl+C"快捷键可以清空当前输入,或者停止正在运行的程序。常用的快捷键如表2-1所示。

:IPython常用快捷键

快捷键

功能

Ctrl+P或上箭头

搜索之命令历史中以当前输入文本开头的命令

Ctrl+N或下箭头

搜索之命令历史中以当前输入文本开头的命令

Ctrl+Shift+V

粘贴代码或代码块

Ctrl+A

跳转到行头

Ctrl+E

跳转到行尾

Ctrl+R

搜索命令历史中包含当前输入关键词的命令

魔术方法 IPython中还提供了一些特殊的命令,这些命令以%开头,称为魔术方法。例如,可以通过%hist查看当前IPython下的输入历史等,示例如下:

In [1]: import torch as t
 
In [2]: a = t.Tensor(2,3)
 
In [3]: %timeit a.sum() # 检测某条语句的执行时间
7.34 µs ± 18.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)In [4]: %hist # 查看输入历史
import torch as t
a = t.Tensor(2, 3)
%timeit a.sum()
%hist
 
In [5]: %paste # 执行粘贴板中的代码,如果只需粘贴但不执行,那么使用“Ctrl+Shift+V”
def add(x, y, z):
     return x + y + z
## -- End pasted text --
 
In [6]: %cat a.py # 查看某一个文件的内容,这个文件只有两行代码
b = a + 1
print(b.size())
 
In [7]: %run -i a.py # 执行文件,-i选项代表在当前命名空间中执行
                     # 此时会使用当前命名空间中的变量,结果也会返回至当前命名空间
torch.Size([2, 3])
 
In [8]: b 
Out[8]: 
 
tensor([[1., 1., 1.],
        [1., 1., 1.]])

和普通Python对象一样,魔术方法也支持自省,可以在命令后面加???查看对应的帮助文档或源代码。例如,通过%run?可以查看它的使用说明。其他常用魔术方法如表2-2所示。

:IPython的常用魔术方法

命令

说明

%debug

最重要的命令,进入调试模式(按q退出)

%quickref

显示快速参考

%who

显示当前命名空间中的变量

%magic

查看所有魔术命令

%env

查看系统环境变量

%xdel

删除变量并删除其在IPython上的一切引用

粘贴 IPython支持多种格式的粘贴,除了使用%paste魔术方法,还可以直接粘贴多行代码、doctest代码和IPython的代码(下面的代码都是使用“Ctrl+V”直接粘贴的,如果是Linux终端,那么应该使用“Ctrl+Shift+V”直接粘贴,或者单击鼠标右键,选择"粘贴"选项)。

In [1]: In [1]: import torch as t
   ...: 
   ...: In [2]: a = t.rand(2, 3)
   ...: 
   ...: In [3]: a
Out[1]: 
tensor([[0.9308, 0.3277, 0.4836],
        [0.8710, 0.8060, 0.7158]])
 
In [2]: >>> import torch as t
   ...: >>> a = t.rand(2, 3)
   ...: >>> a
   ...: 
Out[2]: 
tensor([[0.3637, 0.3146, 0.8401],
        [0.2032, 0.7698, 0.3965]])
 
In [3]: import torch as t
   ...: a = t.rand(2, 3)
   ...: a
Out[3]: 
tensor([[0.6753, 0.6220, 0.3510],
        [0.9146, 0.5749, 0.4940]])

使用IPython进行调试 IPython最主要、最好用的功能就是调试。IPython的调试器ipdb增强了pdb,提供了很多实用的功能,例如“Tab”键自动补全、语法高亮等。当通过%run main.py 运行程序报错时,IPython并不会退出,此时用户可以使用魔术命令%debug进入调试模式,直接跳转到报错的代码处,这样可以降低复现程序错误导致的开销。在调试模式下,可通过u、d实现堆栈中的上下移动,常用的调试命令如表2-3所示。

:ipdb常用的调试命令

命令

功能

h(elp)

显示帮助信息,help command显示这条命令的帮助信息

u(p)

在函数调用栈中向上移动

d(own)

在函数调用栈中向下移动

n(ext)

单步执行,执行下一步

s(tep)

单步进入当前函数调用

a(rgs)

查看当前调用函数的参数

l(ist)

查看当前行的上下文参考代码

b(reak)

在指定位置上设置断点

q(uit)

退出

调试是一个重要功能,不仅在学习PyTorch时需要用到,而且在平时学习Python或者使用IPython时也会经常使用。更多的调试功能,可以通过h <命令>查看该命令的使用方法。关于调试的更多技巧将在本书第9章进行介绍。

如果想在IPython之外使用调试功能,那么首先需要使用命令pip install ipdb安装ipdb,然后在需要调试的地方加上以下代码:

import ipdb
ipdb.set_trace()

当程序运行到这一步时,会自动进入调试模式。

3.3 Jupyter Notebook

Jupyter Notebook是一个交互式笔记本,前身是IPython Notebook,后来它从IPython中独立出来,目前支持运行40多种编程语言。对希望编写漂亮的交互式文档和从事科学计算的用户来说,Jupyter Notebook是一个不错的选择。

Jupyter Notebook的使用方法与IPython非常类似,Jupyter Notebook有以下三个优势。

  • 更美观的界面:相比在终端下使用IPython,Jupyter Notebook提供图形化操作界面,对新手而言更加美观简洁。
  • 更好的可视化支持:Jupyter Notebook与Web技术深度融合,支持直接在Jupyter Notebook中可视化,这对于需要经常绘图的科学运算实验来说十分便利。
  • 方便远程访问:在服务器端开启Jupyter Notebook服务后,客户端电脑只需有浏览器且能访问服务器,就可以使用远程服务器上的Jupyter Notebook。这对于使用Linux服务器,而办公电脑使用Windows的用户来说十分方便,避免了在本地配置环境的复杂流程。

安装Jupyter Notebook只需要一条pip命令:

pip install jupyter   安装完成后,用户在命令行输入jupyter notebook命令即可启动Jupyter,此时浏览器会自动弹出,并打开Jupyter主界面。用户也可以手动打开浏览器,输入http://127.0.0.1:8888(Jupyter Notebook的默认端口是8888,用户可以在启动时指定不同的端口)访问Jupyter,界面如图2-8所示。

点击右上角的“New”选项,选择相应的Notebook类型(如Python3、Python2等),就可以新建一个Notebook。读者可以在In[ ]后面的编辑区输入代码,按“Ctrl+Enter”键运行代码,如图2-9所示。

如果用户需要访问远程服务器的Jupyter Notebook,那么需要在服务器中搭建Jupyter Notebook服务,然后通过浏览器访问,设置流程如下。

(1)生成Jupyter的配置文件:

jupyter notebook --generate-config执行上述命令,会在当前用户的.jupyter目录下生成名为jupyter_notebook_config.py的配置文件。

(2)设置密码,并获取加密后的密码:

from notebook.auth import passwd
 
p = passwd()
# 输入密码
# 确认密码
print(p)

打印得到的结果argon2:... 即为加密后的密码。

(3)打开第一步生成的配置文件,修改以下内容:

# 加密后的密码
c.NotebookApp.password = u'argon2:...' 
 
# 如果只想绑定某个ip,那么改成对应的ip即可
c.NotebookApp.ip = '*'
 
# 绑定的端口号,如果该端口已经被占用,
# 会自动使用下一个端口号10000
c.NotebookApp.port = 9999 

(4)启动Jupyter Notebook:

jupyter notebook

(5)在客户端打开浏览器,访问url:http://[服务器ip]:9999,输入密码,即可访问Notebook。

如果客户端浏览器无法打开Jupyter Notebook,那么有可能是防火墙的缘故,用户可以输入以下命令开放对应的端口(若使用IPV6,请把命令iptables改成ip6tables)。

iptables -I INPUT -p tcp --dport 9999 -j ACCEPT
iptables save

Jupyter Notebook的使用和IPython极为类似,上文介绍的IPython使用技巧在Jupyter Notebook中都基本适用。它支持自动补全、内省、魔术方法、调试等功能,但它的快捷键与IPython有较大不同,读者可通过菜单栏的【Help】→【Keyboard Shortcuts】查看详细的快捷键。Jupyter Notebook还支持很多功能,如Markdown语法、HTML、各种可视化等。更多关于IPython和Jupyter Notebook的使用技巧,读者可以查看官方文档。

除了Jupyter Notebook,Jupyter还推出了最新的数据科学工具JupyterLab。JupyterLab包含了Jupyter Notebook的全部功能,并增强了交互式体验,如提供仪表盘用于灵活地更改参数、多视图预览同一文件等。二者的操作基本一致,读者可根据个人喜好进行选择。

4 服务器开发介绍

一般来说,用户的大规模计算资源(如GPU)都部署在远程服务器上,而用户通常是在本地进行代码编辑。因此,服务器开发是最常见的一种开发模式。下面对常用的几种服务器开发模式进行总结。

  • 首先将服务器的文件夹通过SSHFS挂载到本地,然后通过VS Code打开,用本地的Python解释器运行、调试代码。在这种开发模式下,挂载的文件读写、运行较慢,而且无法使用服务器的GPU。
  • 在本地的VS Code中编写代码,通过Git上传到远程服务器,在服务器上使用IPython/Python运行代码。这种做法比较烦琐,不方便调试。
  • 首先在远程服务器上启动Jupyter Notebook或JupyterLab,然后在本地使用浏览器或者VS Code连接远程的Jupyter编写代码。由于Jupyter自带的编辑功能比较简陋,这个方法也不推荐。
  • 笔者最推荐的方法:首先利用VS Code的Remote SSH打开远程服务器上的文件夹,然后使用远程服务器的Python解释器运行、调试代码。在这种开发模式下,代码启动更快,读取远程数据也更方便。

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

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

相关文章

Redis 大Key排查与优化

Redis 大Key排查与优化 什么是BigKey bigkey简单来说就是存储本身的key值空间太大&#xff0c;或者hash&#xff0c;list&#xff0c;set等存储中value值过多。没有具体的衡量标准。 参考的大小范围&#xff1a; String 类型值大于10KB。Hash、List、Set、Zset类型元素个数…

【Mybatis Plus】Mybatis Plus_快速上手

文章目录 1.Mybatis Plus 简介2.与SpringBoot集成2.1在maven中引入MP依赖2.3 在application.yml中&#xff0c;配置好自己的数据库文件 3. 快速上手 创建实体类entity/User.java3.1创建通用Mapper3.2 使用继承了BaseMapper的Mapper开始编写Crud3.2.1 Insert3.2.2 deleted3.2.3 …

5.1树的基本概念

5.11树的定义 树是n>0的有限集.树适用于有层次结构的数据 只有根节点无前驱 只有叶子节点无后继 有后继的节点为分支节点 除根节点外,任何一个节点都有且只有一个前驱 5.12树的基本术语 祖先节点:从k-->R经过的所有节点 子孙节点:从一个节点出发后下面的所有节点 …

Oracle【plsql编写九九乘法表】

九九乘法表 DECLAREi NUMBER : 1;j NUMBER : 1; BEGINFOR i IN 1 .. 9LOOPFOR j IN 1 .. iLOOPDBMS_OUTPUT.put (i || * || j || || i * j || );END LOOP;DBMS_OUTPUT.put_line ( );END LOOP; END;输出结果

【YashanDB数据库】Ubuntu系统加载Yashan C驱动后无法使用PHP

【问题分类】驱动使用 【关键字】驱动使用、PHP、Ubuntu、C驱动 【问题描述】 客户将YashanDB的C驱动lib加载到环境变量LD_LIBRARY_PATH后&#xff0c;PHP报错&#xff1a;PHP Fatal error&#xff1a;Unable to start pcre module in Unknown on line 0 【问题原因分析】经…

集成学习:融合多个模型

集成学习 是一种机器学习范式&#xff0c;它创建一组模型&#xff0c;并将它们的预测结果结合起来&#xff0c;以期望最终模型能够优于单个模型。集成学习的关键在于如何有效地结合不同的模型。 集成学习算法分为&#xff1a;Bagging&#xff0c;Boosting和Stacking等类型。 B…

关于k8s集群的存储卷

目录 1.emptyDir存储卷 2.hostPath存储卷 3.nfs共享存储卷 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet 会重启它&#xff0c;但是容器中的文件将丢失——容器以干净的…

大神器! 直接显示中英文期刊的等级, 及该期刊在中国顶级大学的认可度!

今天&#xff0c;推荐一款学术神器——easyScholar&#xff0c;别看这个插件小小的&#xff0c;它的功能非常强大。 它可以显示期刊的影响因子、中科院分区、JCR分区等信息&#xff01; 比如&#xff0c;它可以在知网数据库中显示期刊等级信息。 也能够在万方数据库中显示期刊等…

【Linux WEB】Linux嵌入式WEB服务器(BOA)部署

1. 下载boa源码 进入官网下载http://www.boa.org/news.html&#xff0c;版本为0.94.13 2. 交叉编译boa源码 2.1 解压boa源码压缩包   将下载好的压缩包放入到Ubuntu系统中进行解压 tar -zxvf boa-0.94.13.tar.gz 2.2 生成并配置Makefile文件 &#xff08;1&#xff09;将…

交换机常用的贴片网络变压器,滤波器H5084NL / H82409S

华强盛电子导读千兆交换机&#xff1a; 199/2643/0038 在交换机行业中&#xff0c;常用的贴片网络变压器和滤波器型号会根据具体的应用需求、性能指标、成本考量等因素而有所不同。通常&#xff0c;这些器件需要满足网络通信中的高频传输、阻抗匹配、信号隔离、电磁兼容&…

【C++】vector 的模拟实现

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

⌈ 传知代码 ⌋ CNN实现脑电信号的情感识别

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

怎么压缩ppt文件?4个常用的PPT压缩技巧分享!

在当今数字化的工作和学习环境中&#xff0c;PPT已经成为我们表达观点、展示成果的重要工具。然而&#xff0c;有时PPT文件的体积过大&#xff0c;给我们的分享和存储带来了诸多不便&#xff0c;表现在&#xff1a;无端占用宝贵的磁盘空间&#xff0c;接收下载耗费时间长等。 …

KSV1(KSU1)/KSV5(KSU5)-创建分配(分摊)规则/运行分配

将A成本中心费用分摊给B、C两个成本中心&#xff1a; 将B、C两个成本中心建一个成本中心组KSV1-创建分配规则 选择发送方的成本中心&#xff0c;选择接收方的成本中心 给不同成本中心分配比例。 点击保存 点击概览可以看到该条规则&#xff0c;可以在系统中创建多条规则。 K…

优阅达携手 HubSpot 助力出海企业营销、销售和服务自动化

2024 年 6 月 17 - 18 日&#xff0c;GTC 2024 全球流量大会在深圳福田会展中心圆满举办。作为跨境出海行业产业链最全、资源最丰富、规模最大的专业展会之一&#xff0c;本次大会聚集了近 3 万名从业者、超过 200 家海内外优质开发厂商&#xff0c;品牌方、服务商&#xff0c;…

【海贼王航海日志:前端技术探索】CSS你了解多少?(二)

目录 1 -> 字体属性 1.1 -> 设置字体 1.2 -> 字体大小 1.3 -> 字体粗细 1.4 -> 文字样式 2 -> 文本属性 2.1 -> 文本颜色 2.1.1 -> 认识RGB 2.1.2 -> 设置文本颜色 2.2 -> 文本对齐 2.3 -> 文本装饰 2.4 -> 文本缩进 2.5 -&g…

Go开发后端和Vue3开发前端的前后端分离框架中自己手戳一个OA流程审批、工作流引擎给新时代一个漂亮便捷的工作流引擎

前言 在软件项目开发中&#xff0c;我们都会接触到流程审批的需要业务&#xff0c;我们以往用的最多就是如下图这种流程编辑引擎插件&#xff1a; 以上截图中的流程工具是不是大家常见的呀&#xff01;感觉很丑拿不出手呀&#xff01;在当前行业内卷及竞争激烈情况下&#xff…

uniapp免费申请苹果证书教程每次7天可用于测试

准备一个苹果账号没有加入过任何组织的 然后下载appuploader下载链接 登录上去切记勾选上未付苹果688 然后点击苹果证书创建p12证书 创建描述文件 uniapp打包自定义基座 这就打包好了可以愉快地开发了&#xff0c;但每次生成只有7天&#xff0c;设备限制3个&#xff0c…

【C++】STL | priority_queue 堆(优先级队列)详解(使用+底层实现)、仿函数的引入、容器适配器的使用

目录 前言 总代码 堆的简介 仿函数 堆的基础框架建立size、empty、top、 向上调整法 and push 向上调整 push 向下调整法 and pop 向下调整法 pop 迭代器区间初始化&#xff08;构造&#xff09; 逻辑讲解 为何选择向下建堆&#xff1f; 建堆代码实现 结语 前言…

区块链的搭建和运维4

区块链的搭建和运维4 (1) 搭建基于MySQL分布式存储的区块链 1.构建单群组网络节点 使用开发部署工具构建单群组网络节点&#xff0c;命令如下&#xff1a; bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,85452. 启动 MySQL 并设置账户密码 输入如下命令&#xff0c;…