1深度學習Pytorch-pytorch、tensor的創建、屬性、設備和類型轉換、數據轉換、常見操作(獲取元素、元素運算、形狀改變、相乘、廣播)

文章目錄

    • PyTorch
    • Tensor
      • 1 Tensor 的創建
        • 1.torch.tensor
        • 2.torch.Tensor
        • 3. 線性張量
        • 4. 隨機張量
        • 5. 特定數值的張量
      • 2 Tensor 常見屬性
        • 1 屬性
        • 2 設備切換
        • 3 類型轉換
          • `torch.Tensor.to(dtype)`
          • 類型專用方法
          • 創建張量時直接指定類型
          • 與 NumPy 數組的類型互轉
      • 4 數據轉換(淺拷貝與深拷貝)
        • 張量轉Numpy
        • Numpy轉張量
      • 5. Tensor常見操作
        • 5.1 獲取元素值
        • 5.2 元素值運算
        • 5.3 形狀操作
          • 5.3.1 改變形狀(reshape /view)
          • 5.3.2 維度增減(unsqueeze /squeeze)
          • 5.3.3 維度交換(transpose /permute)
        • 5.4 阿達瑪積
        • 5.5 Tensor相乘
      • 6 廣播機制(Broadcasting)

PyTorch

PyTorch 是由 Meta(原 Facebook)開發的開源深度學習框架,于 2016 年發布,以靈活性、動態計算圖和易用性為核心特點,廣泛應用于學術研究和工業界。

其核心優勢包括:

  • 動態計算圖:計算過程實時構建,支持在運行中修改網絡結構,便于調試和靈活實驗
  • 自動求導機制:自動計算張量操作的梯度,簡化反向傳播實現
  • GPU 加速:無縫支持 CUDA 加速,大幅提升大規模張量運算效率
  • 豐富生態:配套 TorchVision(計算機視覺)、TorchText(自然語言處理)等工具庫
  • 良好兼容性:支持模型導出為 ONNX 格式,便于跨框架部署

PyTorch 的核心數據結構是張量(Tensor),所有神經網絡操作都圍繞張量展開。

Tensor

  • 核心數據結構: torch.Tensor 是 PyTorch 中最基本、最重要的數據結構,類似于 NumPy 的 ndarray,但擁有額外的特性使其適用于深度學習。
  • 本質: 一個多維數組(張量)。標量是 0 維張量,向量是 1 維張量,矩陣是 2 維張量,依此類推。
  • 關鍵特性:
    • GPU 加速: 可以輕松地將 Tensor 移動到 GPU 上進行高速并行計算。
    • 自動微分 (Autograd): Tensor 可以跟蹤在其上執行的操作,以自動計算梯度(導數),這是訓練神經網絡的核心(反向傳播)。
    • 豐富的操作: 提供了大量用于數學運算、線性代數、隨機采樣等的函數。

1 Tensor 的創建

有多種方式創建 Tensor:

1.torch.tensor

從 Python 列表或序列創建:

import torch
# 創建標量 (0維)
scalar = torch.tensor(3.14)
# 創建向量 (1維)
vector = torch.tensor([1, 2, 3, 4])
# 創建矩陣 (2維)
matrix = torch.tensor([[1., 2.], [3., 4.]])
# 創建3維張量
tensor_3d = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
2.torch.Tensor
# 1. 根據形狀創建張量
tensor1 = torch.Tensor(2, 3)
print(tensor1)
# 2. 也可以是具體的值
tensor2 = torch.Tensor([[1, 2, 3], [4, 5, 6]])
print(tensor2, tensor2.shape, tensor2.dtype)tensor3 = torch.Tensor([10])
print(tensor3, tensor3.shape, tensor3.dtype)# 指定tensor數據類型
tensor1 = torch.Tensor([1,2,3]).short()
print(tensor1)tensor1 = torch.Tensor([1,2,3]).int()
print(tensor1)
3. 線性張量

使用 torch.arange() / torch.linspace() 創建線性序列

  • torch.arange(start=0, end, step=1) 類似 Python range,創建從 startend(不包括 end),步長為 step 的 1 維 Tensor。
  • torch.linspace(start, end, steps) 創建從 startend(包括 end)的等間隔 steps 個點組成的 1 維 Tensor。
# 類似range,生成[start, end)的整數序列
t_arange = torch.arange(0, 10, step=2)  # 結果:[0, 2, 4, 6, 8]# 生成均勻分布的線性序列(包含end)
t_linspace = torch.linspace(0, 1, steps=5)  # 結果:[0.0, 0.25, 0.5, 0.75, 1.0]
4. 隨機張量

使用 torch.rand() / torch.randn() / torch.randint() 創建隨機初始化的 Tensor。

  • torch.rand(*size)[0, 1) 均勻分布中隨機采樣。
  • torch.randn(*size)標準正態分布(均值為0,方差為1) 中隨機采樣。
  • torch.randint(low, high, size)[low, high) 的整數均勻分布中隨機采樣。
# 均勻分布 [0,1)
t_rand = torch.rand(2, 3)  # 形狀為(2,3)的隨機張量# 標準正態分布(均值0,方差1)
t_randn = torch.randn(3, 3)# 隨機整數 [low, high)
t_randint = torch.randint(low=0, high=10, size=(2, 2))  # 2x2的0-9隨機整數# 固定隨機種子(保證結果可復現)
torch.manual_seed(42)
5. 特定數值的張量
t_zeros = torch.zeros((2, 3))  # 全零張量,形狀(2,3)
t_ones = torch.ones((3, 3))   # 全一張量
t_full = torch.full((2, 2), 5)  # 填充指定值(5)
t_eye = torch.eye(3)  # 單位矩陣(對角線為1,其余為0)

2 Tensor 常見屬性

1 屬性
.shape張量的形狀(各維度大小)t = torch.rand(2, 3); print(t.shape)torch.Size([2, 3])
.size().shape 等價,返回形狀元組print(t.size(0))2(第 0 維大小)
.dtype數據類型(如 float32、int64 等)print(t.dtype)torch.float32
.device存儲設備(CPU 或 GPU)print(t.device)cpucuda:0
.requires_grad是否需要計算梯度(用于反向傳播)t = torch.tensor(2.0, requires_grad=True); print(t.requires_grad)True
.grad存儲梯度值(需先調用 .backward()t.backward(); print(t.grad)tensor(1.)(示例梯度值)
.is_cuda是否在 GPU 上(布爾值)print(t.is_cuda)False(CPU 上)
.numel()總元素數量(各維度大小乘積)print(t.numel())6(2×3 的張量)
2 設備切換

PyTorch 支持張量在 CPU 和 GPU 之間遷移,以利用 GPU 的并行計算能力加速深度學習任務。

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

方法 1:使用 .to(device)

# 創建一個 CPU 上的張量
t_cpu = torch.tensor([1, 2, 3])
print("原始設備:", t_cpu.device)  # cpu# 遷移到 GPU(若可用)
t_gpu = t_cpu.to(device)
print("遷移后設備:", t_gpu.device)  # cuda:0(若有GPU)# 從 GPU 遷回 CPU
t_cpu2 = t_gpu.to("cpu")
print(t_cpu2.device)  # cpu

方法 2:使用 .cuda().cpu()

    t2 = torch.tensor([1,2,3])t2 = t2.cuda()print(t2)t3 = t2.cpu()print(t3)
3 類型轉換
torch.Tensor.to(dtype)

通用方法,通過 dtype 參數指定目標類型,適用于所有轉換場景:

import torch# 原始張量(int64類型)
t = torch.tensor([1, 2, 3], dtype=torch.int64)
print("原始類型:", t.dtype)  # torch.int64# 轉換為 float32(默認浮點類型)
t_float32 = t.to(torch.float32)
print("轉換為float32:", t_float32.dtype)  # torch.float32# 轉換為 int32
t_int32 = t.to(torch.int32)
print("轉換為int32:", t_int32.dtype)  # torch.int32# 轉換為 bool 類型(非0值為True)
t_bool = t.to(torch.bool)
print("轉換為bool:", t_bool.dtype, t_bool)  # torch.bool tensor([True, True, True])
類型專用方法

PyTorch 為常用類型提供了專用方法,更簡潔直觀:

t = torch.tensor([1, 2, 3], dtype=torch.int32)t_float = t.float()       # 等價于 to(torch.float32)
t_double = t.double()     # 等價于 to(torch.float64)
t_long = t.long()         # 等價于 to(torch.int64)
t_int = t.int()           # 等價于 to(torch.int32)
t_bool = t.bool()         # 等價于 to(torch.bool)
創建張量時直接指定類型

通過 dtype 參數在創建張量時就確定類型,避免后續轉換:

# 直接創建 float16 類型張量
t_half = torch.tensor([1.5, 2.5], dtype=torch.float16)
print(t_half.dtype)  # torch.float16# 直接創建 uint8 類型張量(圖像數據常用)
t_uint8 = torch.tensor([0, 128, 255], dtype=torch.uint8)
print(t_uint8.dtype)  # torch.uint8
與 NumPy 數組的類型互轉

PyTorch 張量與 NumPy 數組轉換時,類型會自動對應,也可顯式指定:

import numpy as np# NumPy 數組(float64類型)
np_arr = np.array([1.2, 3.4], dtype=np.float64)# 轉換為 PyTorch 張量(默認對應 float64)
t = torch.from_numpy(np_arr)
print(t.dtype)  # torch.float64# 轉換時顯式指定類型
t = torch.from_numpy(np_arr).to(torch.float32)
print(t.dtype)  # torch.float32# 張量轉 NumPy 數組(保留類型)
np_arr2 = t.numpy()
print(np_arr2.dtype)  # float32

4 數據轉換(淺拷貝與深拷貝)

在 PyTorch 中理解數據轉換(尤其是涉及內存共享)非常重要,因為它直接影響內存使用和計算結果。

  • 淺拷貝 (Shallow Copy): 創建一個新對象,但新對象的內容是對原對象內容的引用。修改新對象的內容可能會改變原對象的內容(因為它們共享底層數據)。內存效率高。
  • 深拷貝 (Deep Copy): 創建一個新對象,并且遞歸地復制原對象及其包含的所有對象。新對象與原對象完全獨立,修改其中一個不會影響另一個。內存開銷更大。
張量轉Numpy

numpy():張量轉numpy數組,淺拷貝,修改numpy的元素會修改張量元素

numpy().copy():深拷貝,復制一個副本,修改副本不會影響源張量元素

    t = torch.tensor([1,2,3])print(t)	#tensor([1, 2, 3])# numpy():張量轉numpy數組,淺拷貝,修改numpy的元素會修改張量元素a = t.numpy()a[0]=100print(a)	#[100   2   3]print(t)	#tensor([100,   2,   3])b = t.numpy().copy()# numpy().copy():深拷貝,復制一個副本,修改副本不會影響源張量元素b[0]=200print(b)	#[200   2   3]print(t)	#tensor([100,   2,   3])
Numpy轉張量

torch.from_numpy():numpy數組轉張量,淺拷貝,修改張量元素會修改numpy的元素

torch.tensor():numpy數組轉張量,深拷貝,會創建新的存儲空間,修改副本不會影響源numpy元素

    a = np.array([1,2,3])print(a)# torch.from_numpy():numpy數組轉張量,淺拷貝,修改張量元素會修改numpy的元素t = torch.from_numpy(a)print(t)t[0] = 100print(t,a)# torch.tensor():numpy數組轉張量,深拷貝,復制一個副本,修改副本不會影響源numpy元素t1 = torch.tensor(a)t1[0]=999print(a)

5. Tensor常見操作

5.1 獲取元素值

item()方法:單個元素的數組獲取元素值,維度不影響

  • 和Tensor的維度沒有關系,都可以取出來
  • 如果有多個元素則報錯
    t = torch.tensor(10)print((t.item()))t1 = torch.tensor([[10]])print(t1.item())
5.2 元素值運算

常見的加減乘除次方取反開方等各種操作,帶有_的方法則會替換原始值。

import torchdef test001():# 生成范圍 [0, 10) 的 2x3 隨機整數張量data = torch.randint(0, 10, (2, 3))print(data)# 元素級別的加減乘除:不修改原始值print(data.add(1))print(data.sub(1))print(data.mul(2))print(data.div(3))print(data.pow(2))# 元素級別的加減乘除:修改原始值data = data.float()data.add_(1)data.sub_(1)data.mul_(2)data.div_(3.0)data.pow_(2)print(data)if __name__ == "__main__":test001()
5.3 形狀操作

調整 Tensor 的維度和形狀是適配神經網絡輸入輸出的關鍵操作。

5.3.1 改變形狀(reshape /view)
  • view(new_shape):修改數組形狀,不改變內存存儲順序,效率較高,
    • 前提是tensor在內存中是連續的,否則需先用contiguous()轉換;
    • 如果進行轉置等操作導致數據不連續,此時使用view()方法會報錯
    • 支持 -1 自動計算維度,總元素數必須與原張量一致
  • reshape(new_shape):功能類似 NumPy 的reshape,會自動處理非連續情況(內部可能調用view或復制數據)
x = torch.arange(12)  # 形狀:(12,)# reshape:靈活改變形狀(推薦,自動處理非連續內存)
x1 = x.reshape(3, 4)  # 3行4列 → (3,4)
x2 = x.reshape(2, 2, 3)  # 3維 → (2,2,3)# view:類似reshape,但要求Tensor內存連續(不連續時會報錯)
x3 = x.view(4, 3)  # 4行3列 → (4,3)
5.3.2 維度增減(unsqueeze /squeeze)
  • unsqueeze:用于在指定位置插入一個大小為 1 的新維度。

  • squeeze:用于移除所有大小為 1 的維度,或者移除指定維度的大小為 1 的維度;若刪除的維度數不為1,則不做任何操作,也不報錯

x = torch.tensor([1, 2, 3])  # 形狀:(3,)# unsqueeze:在指定位置增加一個維度(維度大小為1)
x_unsq0 = x.unsqueeze(0)  # 形狀:(1,3)(在第0維增加)
x_unsq1 = x.unsqueeze(1)  # 形狀:(3,1)(在第1維增加)# squeeze:刪除大小為1的維度(默認刪除所有)
x_sq0 = x_unsq0.squeeze()  # 形狀:(3,)(刪除第0維)
x_sq1 = x_unsq1.squeeze(1)  # 形狀:(3,)(指定刪除第1維)
5.3.3 維度交換(transpose /permute)

transpose: 用于交換張量的兩個維度,返回新張量,原張量不變

permute:重新排列張量的維度,不改變張量的數據,只改變維度的順序

x = torch.randn(2, 3, 4)  # 形狀:(2,3,4)(假設為[batch, height, width])# transpose:交換兩個維度
x_trans = x.transpose(1, 2)  # 交換1和2維 → 形狀:(2,4,3)# permute:重排所有維度(更靈活)
x_perm = x.permute(2, 0, 1)  # 維度順序變為2→0→1 → 形狀:(4,2,3)
5.4 阿達瑪積

對兩個形狀相同的 Tensor,對應位置的元素相乘,結果形狀與輸入相同。

實現方式:

  • 運算符:*
  • 函數:torch.mul(a, b)
  • 方法:a.mul(b)
'''# 阿達碼積:
前提:兩個矩陣形狀相同;
兩個矩陣相同位置元素相乘:Cij = Mij * Nij
運算:mul   *
'''t = torch.tensor([[1,2,3],[3,4,5]])t1 = torch.tensor([[5,6,6],[7,8,9]])print(t.mul(t1))print(t*t1)'''tensor([[ 5, 12, 18],[21, 32, 45]])tensor([[ 5, 12, 18],[21, 32, 45]])	'''
5.5 Tensor相乘

要求前一個矩陣的列數等于后一個矩陣的行數。

實現方式:

  • 運算符:@
  • 函數:torch.matmul(a, b)
  • 方法:a.matmul(b)
'''
矩陣運算:(M X N) x (N X M)
第一個矩陣的第一行于第二個矩陣的第一列元素分別相乘之和...
運算符號:matmul  @
'''t = torch.tensor([[1,2,3],[3,4,5]])t1 = torch.tensor([[5,6],[7,8],[9,10]])print(t.matmul(t1))print(t@t1)'''tensor([[ 46,  52],[ 88, 100]])tensor([[ 46,  52],[ 88, 100]])'''

6 廣播機制(Broadcasting)

當兩個 Tensor 形狀不同時,PyTorch 會自動擴展它們的維度以匹配,便于元素級運算(類似 NumPy 的廣播)。

廣播規則

  1. 若維度數量不同,在形狀較短的 Tensor 前補 1,直到維度數量一致。
  2. 對于每個維度,若兩個 Tensor 的大小相同,或其中一個為 1,則可廣播(擴展為較大的大小)。
a = torch.tensor([[1, 2, 3], [4, 5, 6]])  # 形狀:(2,3)
b = torch.tensor([10, 20, 30])           # 形狀:(3,)# 廣播后:
# a保持(2,3),b擴展為(2,3) → [[10,20,30], [10,20,30]]
c = a + b  # 結果:[[11,22,33], [14,25,36]]# 另一個例子:(3,1) 與 (1,4) 廣播為 (3,4)
d = torch.tensor([[1], [2], [3]])  # (3,1)
e = torch.tensor([[10, 20, 30, 40]])  # (1,4)
f = d + e  
# 結果:3x4矩陣 → [[11,21,31,41], [12,22,32,42],[13,23,33,43]]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92056.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92056.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92056.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

五、Istio管理網格外部服務

因語雀與csdn markdown 格式有區別,請查看原文: https://www.yuque.com/dycloud/pss8ys 一、Egress Listener 流量策略 前面學習了 sidecar 自動注入原理、inbound Listener、outbound Listener 等概念,也知道了 EgressListener 的流量策略…

Ubuntu20.04 離線安裝 FFmpeg 靜態編譯包

系統版本 Ubuntu20.04 去現場部署項目,發現現場的設備連接的內網,無法使用apt直接安裝ffmpeg ,想解決也簡單,數據線連接手機使用共享網絡,再使用命令sudo apt install ffmpeg安裝即可,奈何現場百多臺設備&a…

C語言高級編程技巧與最佳實踐

C語言高級編程技巧與最佳實踐 - 完整版 目錄 宏定義與預處理技巧內存管理高級技巧函數指針與回調機制數據結構設計并發與多線程錯誤處理與異常機制性能優化技巧調試與測試技巧跨平臺編程安全編程實踐綜合演示示例 宏定義與預處理技巧 1. 條件編譯與平臺檢測 /*** 平臺和編譯…

cygwin+php教程(swoole擴展+redis擴展)

cygwin 1.下載cygwin安裝程序 :在Windows上獲得Linux的感覺 ? 2. 打開安裝包:setup-x86_64.exe 3.選擇安裝類型 從互聯網安裝首次安裝下載而不安裝僅下載軟件包不安裝從本地目錄安裝遷移程序時使用 4.選擇安裝目錄 5.選擇本地軟件包目錄&#xff…

Ethereum: Uniswap V3核心”Tick”如何引爆DEX的流動性革命?

大家好,今天,我們來聊聊一個在去中心化交易所(DEX)領域,尤其是自Uniswap V3問世以來,變得至關重要的概念——Tick(流動性邊界)。 如果大家接觸過DeFi,可能聽說過Uniswap …

【概念學習】什么是深度學習

人工智能 人工智能的簡潔定義如下:努力將通常由人類完成的智力任務自動化。 因此,人工智能是一個綜合性的領域,不僅包括機器學習與深度學習,還包括更多不涉及學習的方法。 在相當長的時間內,許多專家相信,只…

【MATLAB】(八)矩陣

一.矩陣的定義MATLAB 以矩陣作為數據操作的基本單位,這使得矩陣運算變得非常簡捷、方便、高效。矩陣是由m*n個數q(i1,2,…,m;j1,2,…,n),排成的m行n列數表,記成稱為 mxn 矩陣,也可以記成aij或Am*n。其中,i表示行數,j表…

python的高校考研交流系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持: 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具:Navicat/SQLyog等都可以 在當今社…

從零開始部署Qwen3-8b大模型到本地

一、方法一(使用docker鏡像進行部署) 安裝Linux服務器,本機測試系統為Ubuntu系統;(帶有2張A100的GPU服務器) 思路為:使用docker部署python環境鏡像在此基礎上安裝vllm拉取Qwen3-8b模型 docker-compose.yml文件部分配…

AI產品經理如何理解和應用Transformer架構,以提升產品的技術能力和用戶體驗?

?你好,我是 ?三橋君? 助你邁向AGI時代!!! 📌本文介紹📌 >> 一、引言 在當今的AI浪潮中,Transformer架構已不再是一個陌生的技術名詞。從OpenAI的GPT系列到Google的BERT,再…

數據結構(四)內核鏈表、棧與隊列

一、內核鏈表基礎1. 什么是 Linux 內核鏈表?Linux 內核鏈表是一種高效的 雙向循環鏈表,廣泛應用于內核模塊開發中,用于管理數據結構。每個節點通過指針連接前一個和后一個元素,實現插入和刪除的高性能。2. 鏈表的定義與初始化在 L…

軟考信息安全工程師11月備考

目前是在職備考,主業是移動端開發工程師。第一個月(8.4-9.6),將分享完下面所有章節內容,平均不到兩天更新一節1.網絡信息安全概述2.網絡攻擊原理與常用方法3.密碼學基本理論4.網絡安全體系與網絡安全模型5.物理與環境安全技術6.認證技術與原理…

使用DrissionPage實現xhs筆記自動翻頁并爬取筆記視頻、圖片

使用DrissionPage實現xhs筆記自動翻頁并爬取筆記視頻、圖片 聲明: 本文章中所有內容僅供學習交流使用,不用于其他任何目的,不提供完整代碼,抓包內容、敏感網址、數據接口等均已做脫敏處理,嚴禁用于商業用途和非法用途,否則由此產生的一切后果均與作者無關! 本文章未經…

使用 input 上傳文件, 選擇文件后再次修改文件再上傳失敗( <input type=“file“ /> 自定義上傳)

業務實際需求:點擊【選擇】按鈕先選擇文件,展示文件的詳情:類型,大小,日期......點擊【上傳】按鈕這個時候才去上傳文件如圖:BUG復現:點擊上傳文件后發現xlsx文件有些數據沒填寫,然后…

Win11 下解決 VScode/Trae 插件加載慢, 整個 VScode/Trae 很卡

最近在使用 Trae 寫代碼, 突然變得很卡, 尤其是插件系統, 比如我打開插件的面板, 以及比如我想預覽一下寫好的 .md 文件 (已安裝了 Markdown Preview Enhanced 插件), 這些都要好幾分鐘才能打開. 最初以為是 Trae 壞掉了, 然后重啟 Trae 不管用, 再重啟電腦居然也不管用, 接著…

微型導軌:智能家居抽屜的智能化應用

當智能家居從“功能堆砌”轉向“體驗升級”,微型導軌憑借超薄結構、靜音運行與精準定位能力,成為隱藏式設計、自動化交互的核心部件,讓家具“動”得優雅且可靠。智能掃地機器人:微型導軌被應用于邊刷的伸縮調節機構,能…

百套易語言教程、易語言視頻教程【易語言編程入門教程】

百套易語言教程、易語言視頻教程【易語言編程入門教程】 易語言輔助教程(愛易編程論壇講師 24課講師:遠航 9課愛易編程論壇講師:愛易、小Call 8課).rar 時光論壇易語言全套教程【易語言零基礎易語言抓包易語言填表】完整版.rar 易…

nlp-詞匯分析

目錄 一、語言中的詞匯 1、詞的形態學 2、詞的詞性 二、詞語規范化 1、詞語切分 2、詞形還原 3、詞干提取 三、中文分詞 1、概述 2、基于最大匹配的中文分詞 3、基于線性鏈條件隨機場的中文分詞 4、基于感知器的中文分詞 詞序列預測 模型參數學習 特征定義 5、…

Kafka ISR機制和Raft區別:副本數優化的秘密

Kafka的ISR機制和像Raft這樣的傳統基于Quorum(法定人數)的協議之間的區別確實很微妙,但也非常重要。讓我們來分析一下為什么ISR可以減少所需的副本數量。在采用ISR模型和(f1)個副本數的配置下,一個Kafka分區…

新手向:GitCode疑難問題診療

Git疑難問題診療引言在軟件開發過程中,版本控制系統(VCS)是不可或缺的工具,而Git以其分布式架構、強大的分支管理能力和高效的性能成為行業標準。然而,隨著項目復雜度的提升,Git的使用也可能遇到各種疑難問…