Python Marimo 互動式筆記本完整教學:取代 Jupyter Notebook 的反應式開發新選擇
如果你跟我一樣,用 Jupyter Notebook 寫資料分析寫了好幾年,一定遇過那個令人崩潰的經典場景:跑完一整串 cell,結果發現某個變數早就被上面某個被刪掉的 cell 改過了,整個 notebook 的狀態亂成一團。Python Marimo 互動式筆記本正是為了徹底解決這個問題而生的,它不只是另一個筆記本工具,而是重新思考了互動式開發該有的樣子。今天這篇教學會帶你從零開始認識 Marimo,看看它為什麼被越來越多開發者視為取代 Jupyter Notebook 的最佳候選人。
Marimo 是什麼?為什麼它值得你關注
Marimo 是一個開源的 Python 互動式筆記本,由前 Google 工程師在 2023 年底推出。它最核心的設計理念只有一個字:反應式(Reactive)。跟 Jupyter 最大的不同在於,當你修改某個 cell 的程式碼時,所有依賴該 cell 的下游 cell 會自動重新執行。這聽起來像是小事,但實際用起來完全是兩個世界。
Marimo 的筆記本檔案就是純 Python 檔案(.py),不是 Jupyter 那種 JSON 格式的 .ipynb。這代表你可以直接用 Git 做版本控制,diff 看得清清楚楚,code review 也變得正常了。對團隊協作來說,這個改變的意義非常大。
Jupyter Notebook 的隱藏狀態問題到底有多嚴重
在深入 Marimo 之前,我想先聊聊為什麼 Jupyter 的問題值得被認真對待。Jupyter 的執行模型是「你按哪個 cell 就跑哪個 cell」,cell 之間的執行順序完全取決於你按的順序,而不是它們在筆記本裡的排列順序。這造成了幾個嚴重後果:
- 隱藏狀態(Hidden State):你刪掉了定義變數的 cell,但變數還活在記憶體裡,下面的 cell 照跑不誤
- 不可重現性:同一份 notebook,「Restart and Run All」的結果可能跟你手動一個一個跑的結果不同
- 協作困難:.ipynb 的 JSON 格式在 Git 上幾乎無法做有意義的 diff
根據 2024 年一項針對資料科學家的調查,超過 60% 的受訪者表示曾因 Jupyter 的隱藏狀態問題浪費超過一小時在 debug。這不是邊緣案例,而是日常。
安裝 Marimo:三分鐘搞定開發環境
安裝 Marimo 非常簡單,推薦使用 Python 3.14 Free Threading 搭配最新的套件管理工具:
# 使用 pip 安裝
pip install marimo
# 或使用 uv(推薦,速度更快)
uv pip install marimo
# 啟動 Marimo 編輯器
marimo edit執行 marimo edit 後,瀏覽器會自動開啟一個乾淨的編輯介面。第一次看到的時候你可能會覺得跟 Jupyter 很像,但開始寫程式之後就會發現核心體驗完全不同。如果你想打開既有的筆記本,直接 marimo edit your_notebook.py 就行了。
反應式執行:Marimo 的殺手級特性
這是 Marimo 最值得深入理解的部分。在 Marimo 裡,每個 cell 都會自動分析它使用了哪些變數、定義了哪些變數。當你修改一個 cell 時,Marimo 會根據這個依賴關係圖(DAG),自動重新執行所有受影響的 cell。
# Cell 1:定義資料
import marimo as mo
data = [1, 2, 3, 4, 5]
# Cell 2:計算(會自動在 Cell 1 改變時重跑)
total = sum(data)
mo.md(f"總和是 **{total}**")
# Cell 3:視覺化(依賴 Cell 2,也會自動更新)
mo.md(f"平均值是 **{total / len(data)}**")這個設計帶來的好處是:你的 notebook 在任何時候都是一致的。不存在「某個 cell 用的是舊版變數」的情況。Marimo 甚至不允許兩個 cell 定義同名變數,從根本上杜絕了命名衝突。我個人覺得這個限制一開始有點不習慣,但用了一週後就回不去了。
內建 UI 元件:不寫前端也能做互動應用
Marimo 內建了豐富的 UI 元件,從基本的滑桿、下拉選單到表格篩選器和檔案上傳。這些元件跟反應式執行深度整合,改變一個滑桿的值,所有依賴它的 cell 會立刻更新。
import marimo as mo
# 建立一個滑桿
slider = mo.ui.slider(start=1, stop=100, value=50, label="樣本數量")
slider
# 這個 cell 會在滑桿改變時自動重跑
import numpy as np
samples = np.random.normal(0, 1, slider.value)
mo.md(f"生成了 {len(samples)} 個樣本,平均值:{samples.mean():.4f}")對於需要做快速原型的場景——比如讓同事自己調參數看結果——這比寫 Streamlit 或 Gradio 快得多。而且你還可以用 marimo run notebook.py 把筆記本直接變成一個獨立的 web 應用,隱藏所有程式碼,只顯示輸出和 UI 元件。這個 App Mode 功能讓我在做 PyCaret AutoML 實驗報告時省了非常多時間。
Marimo vs Jupyter Notebook 功能比較表
| 特性 | Marimo | Jupyter Notebook |
|---|---|---|
| 執行模式 | 反應式(自動依賴更新) | 手動逐 cell 執行 |
| 隱藏狀態問題 | 不存在,架構層面杜絕 | 常見且難以察覺 |
| 檔案格式 | 純 Python (.py) | JSON (.ipynb) |
| Git 友善度 | 極佳,標準 diff | 差,JSON diff 難讀 |
| 內建 UI 元件 | 豐富(滑桿、表格、圖表等) | 需額外安裝 ipywidgets |
| App 部署模式 | 內建 marimo run | 需搭配 Voila 或 Panel |
| 可重現性 | 天生保證 | 需要額外注意執行順序 |
| 生態系統 | 成長中,相容大部分 Python 套件 | 極度成熟,社群龐大 |
| 學習資源 | 官方文件完善,社群逐漸擴大 | 教學資源極豐富 |
什麼時候該用 Marimo、什麼時候留在 Jupyter
我的建議很實際:新專案優先考慮 Marimo,舊專案不用急著遷移。以下是更具體的判斷依據:
適合用 Marimo 的場景:
- 需要頻繁調整參數的探索性分析
- 團隊協作的資料科學專案(Git 友善)
- 需要產出互動式報告或小工具給非技術人員
- 在意程式碼可重現性的研究工作
Jupyter 仍然更適合的場景:
- 需要使用大量 Jupyter-specific 的 magic commands
- 依賴特定 Jupyter extension 的工作流程
- 教學場景(大部分教材仍以 Jupyter 為主)
- 已經在 JupyterHub 上建好的團隊基礎設施
另外值得一提的是,Marimo 可以匯入既有的 .ipynb 檔案,轉換過程通常很順利。所以嘗試的門檻其實很低。
進階技巧:讓 Marimo 發揮最大價值
分享幾個我實際使用後覺得最實用的技巧:
1. 搭配 AI 工具使用:Marimo 的純 Python 格式讓它跟 FastMCP MCP Server 等 AI 開發工具整合時特別順暢,因為 AI 可以直接讀寫 .py 檔案。
2. 善用 mo.stop():在 cell 中加入條件式停止,可以控制反應式更新的範圍,避免不必要的重新計算。
mo.stop(not slider.value > 10, mo.md("請選擇大於 10 的值"))
# 以下只在 slider.value > 10 時執行
expensive_computation(slider.value)3. 用 Layout 元件組織輸出:mo.hstack()、mo.vstack()、mo.tabs() 可以讓你的筆記本輸出看起來像專業的 dashboard。
4. 環境變數管理:mo.cli_args() 讓你在 App Mode 下透過命令列傳入參數,方便自動化流程。
結語:工具進化是必然的
Jupyter Notebook 在過去十年改變了整個資料科學的工作方式,這一點毋庸置疑。但技術在進步,Python Marimo 互動式筆記本代表的是下一代互動式開發的方向——反應式、可重現、對開發者更友善。我不認為 Jupyter 會消失,但 Marimo 確實解決了許多 Jupyter 使用者長期忍受的痛點。
我的建議是:花一個下午試試 Marimo,用它重寫一個你手邊比較簡單的分析專案。體驗過反應式執行之後,你自然會知道它適不適合你的工作流程。工具永遠是為人服務的,選擇讓你更有效率的那一個就對了。
繼續閱讀
Python Matplotlib 資料視覺化入門教學:用圖表說故事的完整指南
資料分析做完了,但老闆看不懂你的數字?Matplotlib 是 Python 最經典的繪圖套件,這篇教你從零畫出各種圖表,讓數據自己說話。
相關文章
你可能也喜歡
探索其他領域的精選好文