跳轉到

2014:Jupyter 問世——文學編程的執行環境#

事件#

  • 2011:IPython 團隊(Fernando Pérez、Brian Granger 等)推出 IPython Notebook——瀏覽器中的互動式筆記本:程式碼、執行結果、數學公式(MathJax)、圖表共存於一份文件。
  • 2014:Notebook 功能已超越「Python shell」的範疇(支援 40+ 種語言的 kernel),專案從 IPython 獨立為 Jupyter Project(名稱取自 Julia、Python、R 三語言)。2015 年 Jupyter 1.0 與 JupyterHub 問世。

為何重要#

  • 文學編程(literate programming)的實踐:Knuth(1984)提出「程式應寫給人讀、交織說明與代碼」的理論;Jupyter 是第一個把此理論變成大規模日常實踐的工具。
  • 科學研究的可重現性革命:論文 + 資料 + 程式碼 + 執行結果合為一份 Notebook,「研究即程式碼」成為可能。2016 年的 LIGO 重力波論文即附帶 Jupyter Notebook。
  • Jupyter 是教育與資料科學的標準介面:GitHub 原生渲染 Notebook、Colab 提供免費 GPU——整個 AI 學習生態建立在 Jupyter 之上。

理論與實用原因#

  • 理論原因:
  • 文學編程(Knuth 1984):程式與文檔不該分離;Notebook 的 cell 結構把「說明、代碼、結果」交織。
  • REPL 驅動開發:源自 LISP(1958)的互動式傳統——「先試、後寫、再存檔」的探索式計算,特別適合資料分析(你不知道資料裡有什麼,直到你看過)。
  • kernel 分離架構:Notebook 前端(瀏覽器)與執行後端(kernel)以 ZeroMQ 訊息協議分離——這個「語言無關」的架構設計讓 Jupyter 超越 Python。
  • 實用原因:科學家與分析師需要「分析的推理過程也要被保存」——傳統腳本只保存代碼,丟失了探索過程與中間結果。

彌補了什麼缺陷#

  • 彌補了 IPython(純 shell)「無法保存圖表與格式化說明、分析過程不可重現」的缺陷。
  • 彌補了傳統腳本「探索式計算的過程遺失」的缺陷——這是資料科學的核心工作流。

程式範例#

Notebook 的工作流——說明、代碼、結果交織(.ipynb 的 cell 概念):

# Cell 1(markdown):
#   ## 資料探索
#   我們先看看 iris 資料集的分佈……

# Cell 2(code):
import pandas as pd
iris = pd.read_csv("iris.csv")
iris.head()                    # 執行結果直接顯示在 cell 下方——

# Cell 3(code):
iris.groupby("species").mean() # 分析過程與中間結果都被保存

Kernel 分離架構——語言無關:

# Notebook 前端(瀏覽器)與後端 kernel 以 ZeroMQ 訊息協議分離
pip install jupyter
jupyter notebook               # 預設 Python kernel

# 支援 40+ 種語言的 kernel——Jupyter 超越了 Python
python -m ipykernel install --user        # Python
# julia> Pkg.add("IJulia")                # Julia kernel
# R>    IRkernel::installspec()           # R kernel

魔術指令與 LIGO 式可重現研究:

In [1]: %matplotlib inline     # 圖表內嵌在 notebook 中
In [2]: %timeit sum(range(1000))
In [3]: %run -t analysis.py    # 計時執行外部腳本

# 論文 + 資料 + 程式碼 + 結果合為一份 .ipynb——「研究即程式碼」

相關條目#