從 Pythonista 到 Rustacean:資料從業者的第一本 Rust 指南

顏志穎 著

  • 出版商: 深智
  • 出版日期: 2026-02-19
  • 定價: $880
  • 售價: 7.9$695
  • 語言: 繁體中文
  • 頁數: 784
  • ISBN: 6267757781
  • ISBN-13: 9786267757789
  • 相關分類: Rust 語言
  • 尚未上市,歡迎預購

  • 從 Pythonista 到 Rustacean:資料從業者的第一本 Rust 指南-preview-1
  • 從 Pythonista 到 Rustacean:資料從業者的第一本 Rust 指南-preview-2
  • 從 Pythonista 到 Rustacean:資料從業者的第一本 Rust 指南-preview-3
  • 從 Pythonista 到 Rustacean:資料從業者的第一本 Rust 指南-preview-4
  • 從 Pythonista 到 Rustacean:資料從業者的第一本 Rust 指南-preview-5
  • 從 Pythonista 到 Rustacean:資料從業者的第一本 Rust 指南-preview-6
  • 從 Pythonista 到 Rustacean:資料從業者的第一本 Rust 指南-preview-7
  • 從 Pythonista 到 Rustacean:資料從業者的第一本 Rust 指南-preview-8
從 Pythonista 到 Rustacean:資料從業者的第一本 Rust 指南-preview-1

商品描述

【內容特點】

快速上手:專為 Python 開發者打造,用熟悉思維無縫接軌 Rust

解鎖高效能:掌握所有權與生命週期,根除記憶體錯誤並突破 GIL

PyO3 實戰:從零開始教你撰寫 Rust 擴充套件,解決 Python 運算瓶頸

AI 落地應用:駕馭 Candle Burn 框架,實現輕量化推論與模型移植

工程化思維:涵蓋模組化設計、自動化測試到效能分析的完整實踐

 

【本書獻給不願在效能與開發效率間妥協的你】

資料科學家:受夠了 Pandas 在大數據下的龜速,想尋找更高效的運算替

代方案。

資料工程師:需要建構高吞吐量、低延遲且穩健可靠的 ETL 管線,徹底告

別執行期錯誤,讓資料流動不再阻塞。

✯ MLOps 工程師:致力於模型生產環境部署,追求在有限算力下達到極致的

推論速度。

進階 Python 開發者:不滿足於語法糖,想深入理解底層運作與並行程式設

計,大幅擴張技術守備範圍。

作者簡介

顏志穎

現任外商科技公司資料工程師,專精於大規模資料處理與 MLOps 架構設計。

曾獲 iThome 鐵人賽 AI & Data 組佳作,熱衷於透過文字梳理技術脈絡。

長期沉浸於 Python 生態系,近年積極探索 Rust 在資料工程領域的實務應用,並樂於將這些「雙刀流」的實戰經驗轉化為文字,與社群共同成長。

工作之餘,是個相信吸貓能提升程式碼品質的快樂鏟屎官。

目錄大綱

▌Part I Rust 的攀登之路

 

►第1 章 建立新思維:Rust 的基本功與工具鏈

1.1 踏入Rust 世界:為何它值得Pythonista 注目?

1.2 安裝Rust 與設定開發環境

    1.2.1 安裝rustup

    1.2.2 驗證安裝

    1.2.3 更新Rust

    1.2.4 開發環境建議

1.3 Pythonista 的第一行Rust:Hello, Performance!

    1.3.1 建立專案資料夾與檔案

    1.3.2 編譯與執行

1.4 核心工具Cargo

    1.4.1 使用Cargo 建立新專案

    1.4.2 建構與執行 Cargo 專案

    1.4.3 Cargo 的常用指令

1.5 告別動態型別:認識變數與原始型別

    1.5.1 資料的綁定:變數、常數與可變性

    1.5.2 萬物的基礎:原始型別 (Primitive Types)

    1.5.3 數值的計算:基礎運算

1.6 組織程式碼:函式 (Functions) 與表達式

    1.6.1 函式簽章 (Function Signature)

    1.6.2 函式本體:陳述式 vs. 表達式

    1.6.3 萬物皆表達式 (Almost)

1.7 揭秘 !:函式的近親,巨集 (Macros)

    1.7.1 為什麼 Rust 需要巨集?

    1.7.2 常用的內建巨集

    1.7.3 println! 的格式化功能

1.8 做出決策:if、else 與 match

    1.8.1 if、else if 與 else

    1.8.2 更強大的分支:match

1.9 重複的藝術:loop、while 與 for

    1.9.1 loop:無限迴圈

    1.9.2 while:條件迴圈

    1.9.3 for:走訪集合

    1.9.4 巢狀迴圈與標籤 (Loop Labels)

1.10 超越原始型別:三大常用集合 (Collections)

    1.10.1 向量 (Vector)

    1.10.2 字串 (String)

    1.10.3 雜湊映射 (HashMap)

1.11 專業風範:程式碼風格與文件化

    1.11.1 註解

    1.11.2 文件註解

    1.11.3 模組與 Crate 文件

    1.11.4 命名規範 (Naming Conventions)

1.12 第一章的登山口:整備行囊與心態

 

►第2 章 Rust 風格的物件導向:Struct、Enum 與 Trait

2.1 結構體 (Struct):定義資料的藍圖

     2.1.1. 經典結構體:我們的第一個自訂型別

     2.1.2. 建立實例的便利語法

     2.1.3. 結構體的其他形式

2.2 Impl ( 實作區塊):為資料賦予行為

    2.2.1 方法 (Methods):&self 的初登場

    2.2.2    關聯函式 (Associated Functions):Rust 的「 建構子」

2.3 列舉 (Enum):定義「多選一」的狀態

    2.3.1    從簡單列舉開始

    2.3.2    攜帶資料的變體:Enum 的真正力量

    2.3.3    match 窮舉:絕不遺漏任何情況

2.4 Option<T>:Rust 的空值處理方案

    2.4.1    None 的問題,Option 的解法

    2.4.2    if let:match 的語法糖

2.5 Trait ( 特徵):定義共通的「能力」

    2.5.1    什麼是 Trait ?

    2.5.2    實作 Trait:賦予型別新能力

    2.5.3    使用 Trait 實現多型:泛型 (Generics)

    2.5.4    #[derive]:讓編譯器為我們工作

    2.5.5    常見的標準庫 Trait:From 與 Into

2.6 第二章的路線圖:辨識地形與規劃路徑

 

►第3 章 無 GC 的記憶體安全:所有權系統

3.1 記憶體小學堂

    3.1.1    基礎概念:記憶體的組織方式

    3.1.2    中階概念:記憶體的座標系統

    3.1.3    進階概念:記憶體的雙核心管理方式

    3.1.4    Stack 的誕生:解決記憶體管理的兩大挑戰

    3.1.5    Heap 的崛起:突破作用域與編譯期的大小限制

    3.1.6    所有權問題的浮現

3.2 所有權:Rust 記憶體管理的核心原則

    3.2.1    所有權的轉移:移動 (Move) vs. 複製 (Copy)

    3.2.2    所有權的訪問:借用 (&) 與參考 (Reference)

    3.2.3    解參考 (*):讀取參考背後的值

3.3 駕馭所有權:常見模式與實戰場景

    3.3.1    函式與資料的互動模式

    3.3.2    結構體與方法的設計模式

    3.3.3    錯誤診斷室:學會與編譯器對話

    3.3.4    所有權問題的思維框架

3.4 所有權試煉

    試煉 3-1:報告的歸檔

    試煉 3-2:狀態訊息的顯示

    試煉 3-3:使用者的暱稱

3.5 第三章的陡峭岩壁:攀越所有權的考驗

 

►第4 章 優雅的資料處理:閉包與迭代器

4.1 什麼是閉包 (Closures) ?— 捕捉環境的匿名函式

    4.1.1    閉包的語法:從函式到閉包

    4.1.2    捕捉環境:閉包的核心威力

4.2 閉包如何捕捉環境:所有權的三種模式

    4.2.1    自動推論:不可變借用、可變借用與取得所有權

    4.2.2    move 關鍵字:強迫閉包取得所有權

4.3 什麼是迭代器 (Iterator) ?處理序列的「惰性」方法

    4.3.1    迭代器的「惰性」

    4.3.2    迭代器的三種模式:.iter(), .iter_mut(), .into_iter()

4.4 Iterator Trait:迭代器的「契約」

    4.4.1    核心方法:.next()

    4.4.2    消耗配接器 (Consuming Adaptors)

    4.4.3    迭代配接器 (Iterator Adaptors)

4.5 組合應用:Option 也能用函數式風格

    4.5.1    心智模型:將 Option 視為「長度 0 或 1」的集合

    4.5.2    常用組合器 (Combinators)

4.6 第四章的高速索道:串起流暢的資料管線

 

►第5 章 穩健的程式碼:Result 與 Panic

5.1 兩類錯誤:不可復原 vs. 可復原

    5.1.1    不可復原的錯誤:panic!

    5.1.2    可復原的錯誤:Result<T, E>

5.2 panic!:當一切都已無可挽回

    5.2.1    拆解 (Unwind) vs. 中止 (Abort)

    5.2.2    追蹤 panic! 的根源:Backtrace

5.3 Result:明確處理「可能」的失敗

    5.3.1    Result 的本質:一個列舉

    5.3.2    處理 Result 的基本功:match

5.4 告別巢狀match:Result 的組合器

    5.4.1    使用 .unwrap_or_else 簡化 match

    5.4.2    快速原型開發:.unwrap() 與 .expect()

5.5 錯誤傳播 (Propagating):? 運算子

    5.5.1    傳統的錯誤傳播 ( 手動 match 與 return)

    5.5.2    現代的錯誤傳播:? 的魔力

    5.5.3    讓 main 函式回傳 Result

5.6 建立自己的錯誤型別

    5.6.1    建構子 (Constructor) 最佳實踐

    5.6.2    使用 enum 窮舉錯誤

    5.6.3    讓 enum 成為「真正」的錯誤

    5.6.4    終極捷徑:thiserror & anyhow Crate

5.7 第五章的風險管理:應對濃霧與突發坍方

 

►第6 章 擴展程式規模:模組化與測試

6.1 程式碼的「三層架構」:Packages, Crates, 與 Modules

    6.1.1    Package ( 套件):Cargo 的專案單位

    6.1.2    Crate:編譯的最小單位

    6.1.3    Module ( 模組):Crate 內部的組織單位

6.2 定義模組:mod 關鍵字與檔案系統

    6.2.1    內嵌模組:最直接的封裝

    6.2.2    拆分到檔案 (External File Modules)

6.3 控制可見性:pub 關鍵字與私有性

    6.3.1    預設私有

    6.3.2    pub 關鍵字:打開對外的那扇窗

    6.3.3    pub struct vs. pub enum:一個微妙的陷阱

    6.3.4    pub(crate):內部的「公開」

6.4 將項目引入作用域:use 關鍵字

    6.4.1    建立捷徑

    6.4.2    絕對路徑 vs. 相對路徑

    6.4.3    路徑管理:as 與 pub use

6.5 撰寫與組織測試

    6.5.1    測試的組織:內部實作 vs. 公開 API

    6.5.2    撰寫基本測試:#[test] 與驗證

    6.5.3    測試特殊情況:panic 與 Result

6.6 執行測試:cargo test 的選項

    6.6.1    執行特定測試

    6.6.2    控制測試執行

    6.6.3    忽略測試:#[ignore]

    6.6.4    cargo-nextest:更強大的測試執行器

6.7 第六章的前進營地:建立營區與設立檢查點

 

►第7 章 參考的有效期限:生命週期

7.1 為何需要生命週期?一切的起點:迷途參考

    7.1.1    一個無法編譯的程式:迷途參考的誕生

    7.1.2    拆解問題:作用域 (Scope) vs. 生命週期 (Lifetime)

7.2 泛型生命週期:當編譯器需要我們幫忙

    7.2.1    函式簽章:連結輸入與輸出的生命週期

    7.2.2    在資料結構中保存參考

    7.2.3    impl 區塊:為帶有生命週期的型別實作方法

7.3 喘口氣:生命週期省略規則(Lifetime Elision Rules)

7.4 特殊生命週期:'static

7.5 集大成:泛型、Trait 與生命週期

7.6 第七章的補給線:精算參考的安全期限

 

►第8 章 無懼的並行:執行緒、共享與同步

8.1 建立執行緒:thread::spawn

    8.1.1    thread::spawn 與 JoinHandle

    8.1.2    move 關鍵字:執行緒的所有權

8.2 執行緒通訊 (1):訊息傳遞 (Message Passing)

    8.2.1    mpsc 通道

    8.2.2    crossbeam-channel 與 MPMC 通道

8.3 智慧指標:為共享狀態做準備

    8.3.1    Box<T>:單一所有權的 Heap 指標

    8.3.2    Rc<T>:單一執行緒的多重所有權

    8.3.3    內部可變性:Cell<T> 與 Copy 型別

    8.3.4    內部可變性:RefCell<T> 與執行時借用

    8.3.5    經典組合:Rc<RefCell<T>>

    8.3.6    Arc<T>:執行緒安全的多重所有權

8.4 執行緒通訊 (2):共享狀態 Mutex<T>

    8.4.1    Mutex<T> ( 互斥鎖)

    8.4.2    經典組合:Arc<Mutex<T>>

8.5 Rust 的終極保證:Send 與 Sync

    8.5.1    Send Trait:允許「所有權」跨執行緒轉移

    8.5.2    Sync Trait:允許「參考」跨執行緒共享

8.6 第八章的同步攻頂:從單人攀登到團隊協作

 

▌Part II 實戰應用!從 Python 擴充到 AI框架的完整旅程

 

►第9 章 PyO3:打造高效能的 Python 擴充套件

9.1 動機剖析:Python 為何需要 Rust 的力量?

    9.1.1    優異的編譯器與開發工具

    9.1.2    透過程序式巨集,弭平語言隔閡

    9.1.3    為沒有 GIL 的未來做好準備

9.2 環境設置:打造現代化的 PyO3 開發流程

    9.2.1    準備兩端的語言環境

    9.2.2    安裝建置工具 maturin

    9.2.3    建立 PyO3 專案

    9.2.4    第一次接觸:手動編譯與測試

    9.2.5    建立自動化測試流程

    9.2.6    深入探索:專案結構與核心設定檔

9.3 思維轉換:從 Python 物件到 Rust 型別

9.4 定義 Python 的入口:打造可 import 的模組

    9.4.1    基礎作法:以函式作為模組入口

    9.4.2    組織巢狀結構:子模組 (Submodule)

    9.4.3    更簡潔的選擇:用 mod 區塊宣告模組

9.5 打造工具:將 Rust 函式化為 Python 函式

    9.5.1    微調 Python 介面:#[pyo3] 屬性

    9.5.2    打造靈活的參數介面

    9.5.3    從Python 到 Rust:FromPyObject 特徵

    9.5.4    全域直譯器鎖 (GIL) 與安全的物件操作

    9.5.5    從 Rust 到 Python:IntoPyObject 特徵

    9.5.6    PyO3 的智慧指標體系:Py<T>、Bound<T> 與 Borrowed<T>

    9.5.7    錯誤處理:當 Result 遇上 Exception

    9.5.8    核心觀念回顧

9.6 塑造物件:將 Rust 自訂型別化為 Python 類別

    9.6.1    第一步:用 #[pyclass] 勾勒藍圖輪廓

    9.6.2    千變萬化的 Enum:從狀態標籤到複合容器

    9.6.3    安全通關:進入 Python 世界的三個前提

    9.6.4    第二步:用 #[pymethods] 加裝操作功能

    9.6.5    物件的誕生:定義建構子

    9.6.6    開放內部資料:欄位的存取與修改

    9.6.7    工具箱與工廠:無需實例也能呼叫的方法

    9.6.8    跨越語言的繼承:讓 Rust 結構體也能開枝散葉

    9.6.9    行為的覆寫:在子類別中與父類別互動

    9.6.10   #[pyclass] 旅程小結

9.7 跨越 GIL 的限制:Rust 的並行處理與 Free-threaded Python

    9.7.1    並行處理的兩種途徑:處理程序與執行緒

    9.7.2    Python 的現狀:在 GIL 下的權衡取捨

    9.7.3    打造 Rust 並行引擎:釋放多核心的潛能

    9.7.4    釋放 GIL 的安全前提

    9.7.5    精準的 GIL 管理:最小化鎖定時間

    9.7.6    在 Rust 執行緒間共享 Python 物件

    9.7.7    擁抱 Free-threaded Python 的未來

9.8 從 GIL 到無懼並行:為何 Python 更需要 Rust ?

 

►第10 章 Hugging Face Candle:點亮輕量化推論的極速火花

10.1 返璞歸真:從 Tensor 開始的 MNIST 訓練生活

    10.1.1   打好地基:專案初始化與模組規劃

    10.1.2   從雲端到記憶體:建構 MnistDataset

    10.1.3   手刻線性層:理解 Candle 的參數管理哲學

    10.1.4   建立漸進式重構工作台

    10.1.5   使用 candle_nn::loss::cross_entropy 重構:從手動計算到最佳踐

    10.1.6   使用 candle_nn::{Linear, Module} 重構:從手刻結構到慣用模式

    10.1.7   使用 candle_nn::optim 重構:從手動更新到自動化迭代

    10.1.8   整合與升級:使用 Batcher 打造現代化訓練迴圈

    10.1.9   實戰演練:打造 LeNet-5 卷積神經網路

    10.1.10  啟用硬體加速:釋放 GPU 的力量

    10.1.11  打造流暢的資料管線:apply 鏈式呼叫

    10.1.12  模型的保存與載入:延續訓練成果

    10.1.13  打完收工:從手刻到框架的修煉之路

10.2 站在巨人的肩膀上:移植 PyTorch 模型

    10.2.1   攤開巨人的藍圖:從 DistilBERT 開始

    10.2.2   搭建施工鷹架:專案結構與模組規劃

    10.2.3   萬丈高樓平地起:實作基礎元件庫 nn.rs

    10.2.4   按圖施工:對應 transformers 原始碼

    10.2.5   訂定施工規格:實作模型設定檔 config.rs

    10.2.6   破土動工:實作輸入嵌入層 embeddings.rs

    10.2.7   賦予專注力:實作多頭自注意力機制 attention.rs

    10.2.8   打造標準樓層:實作單層 Transformer layer.rs

    10.2.9   堆疊樓層成塔:實作 Transformer 編碼器 encoder.rs

    10.2.10  從思緒到語言:實作 MLM 預測頭部 head.rs

    10.2.11  竣工收尾:組裝完整 DistilBERT 模型 distilbert.rs

    10.2.12  驗收成果:在 main.rs 中執行推論

10.3 燭光遍照:從單點模型到完整生態系

 

►第11 章 Burn:燃起 AI 研究與工程的熊熊烈焰

11.1 研製第一艘火箭:用 MNIST 演練從設計到升空的完整流程

    11.1.1   發射台整備:專案初始化與架構藍圖

    11.1.2   認識箭體材質:Burn 張量的特性與操作

    11.1.3   打造燃料輸送帶:定義 Dataset 與 Dataloader

    11.1.4   組裝箭體與酬載:定義 Burn 的模型結構 (Module 與 Config)

    11.1.5   倒數計時與點火:實作訓練迴圈與 Learner

    11.1.6   第二節推進:理解 Backend 並切換至 GPU 加速

    11.1.7   封存航行日誌:模型的儲存

    11.1.8   來自天際的應答:載入模型並驗證推論成果

    11.1.9   章節總結:第一艘火箭的誕生

11.2 停靠太空站:匯入跨框架模型 (ONNX & Safetensors)

    11.2.1   選擇你的對接口:架構生成 vs. 權重裝填

    11.2.2   航線 A:ONNX - 自動化模型生成

    11.2.3   航線 B:Safetensors - 手動對接與權重裝填

    11.2.4   排除對接故障:處理框架不匹配問題

    11.2.5   總結:擴展你的 Burn 艦隊

11.3 從火花到烈焰:Burn 與 Candle 的設計哲學,航向 AI 的無垠宇宙

 

►第12 章 效能分析工具箱:讓 Rust 跑得更快

12.1 效能的度量衡:使用 cargo bench 建立基準

    12.1.1   建立我們的第一個 Benchmark

12.2 找出效能熱點:兩大視覺化利器

    12.2.1   火焰圖 (Flamegraph) 的基本概念

    12.2.2   如何閱讀火焰圖?

    12.2.3   利器一號:經典 cargo-flamegraph

    12.2.4   效能分析的陷阱:採樣到的是誰?

    12.2.5   利器二號:現代 samply

    12.2.6   解讀 samply 的多重視圖

12.3 記憶體:隱形的效能殺手

    12.3.1   記憶體配置的成本 (Allocation Cost)

    12.3.2   跨平台的 Rust Heap 分析器:Dhat

    12.3.3   Dhat 之外:平台原生分析工具

    12.3.4   超越演算法:CPU 快取的影響

12.4 效能思維:從量測到效能調校的完整循環

 

►附錄A :打造高效 Rust 開發環境(VS Code 篇)

A.1 必備工具鏈

    rust-analyzer

    CodeLLDB

A.2 輔助工具

    Even Better TOML

    ErrorLens

    Dependi ( 前身為 Crates)

A.3 風格主題

    Catppuccin

 

►附錄B :找回熟悉的開發節奏:設定Rust REPL 與Jupyter

B.1 終端機 REPL

    B.1.1 evcxr_repl

    B.1.2 IRust

B.2 Jupyter 整合

    B.2.1 安裝 evcxr Jupyter Kernel

    B.2.2 在 Jupyter 中使用 Rust

    B.2.3 IRust Kernel

B.3 超越 REPL:Rustacean 的工作流