可能你已經知道,Python 在 14 年后的“崛起”,得益于機器學習和數學統計應用的興起。那為什么 Python 如此適合數學統計和機器學習呢?作為“老司機”的我可以肯定地告訴你,Jupyter Notebook (https://jupyter.org/)功不可沒。
?
毫不夸張地說,根據我對 Facebook 等硅谷一線大廠的了解,一個 Python 工程師如果現在還不會使用 Jupyter Notebook 的話,可能就真的太落伍了。
?
磨刀不誤砍柴工,高效的工具讓我們的編程事半功倍。這一節課,我就來帶你學習一下 Jupyter Notebook,為后面的 Python 學習打下必備基礎。
?
什么是 Jupyter Notebook?
?
說了這么多,到底什么是 Jupyter Notebook?按照 Jupyter 創始人 Fernando Pérez 的說法,他最初的夢想是做一個綜合 Ju (Julia)、Py (Python)和 R 三種科學運算語言的計算工具平臺,所以將其命名為 Ju-Py-te-R。發展到現在,Jupyter 已經成為一個幾乎支持所有語言,能夠把軟件代碼、計算輸出、解釋文檔、多媒體資源整合在一起的多功能科學運算平臺。
?
英文里說一圖勝千言(A picture is worth a thousand words)。看下面這個圖片,你就明白什么是 Jupyter Notebook 了。
你在一個框框中直接輸入代碼,運行,它立馬就在下面給你輸出。怎么樣,是不是很酷?你可能會納悶兒,這樣一個看起來“華而不實”的玩意兒,真的就成了 Python 社區的顛覆者嗎?說實話放在幾年前我也是不信的。所以 Jupyter Notebook 的影響究竟有多大呢?
?
Jupyter Notebook 的影響力
?
我們衡量一個技術的影響力,或者說要用自己的技術去影響世界時,必定繞不開這個技術對教育界的影響力。
?
就拿微軟的 Word 文本處理系統來說吧。從純技術角度來講,Word 的單機設計理念早已落后時代 20 年。但以 Google Doc 為代表的在線文檔系統,卻并沒有像想象中那樣,實現對 Word 的降維打擊。
?
直觀的原因是用戶習慣,使用 Word 修改文檔,那就來回發幾十遍唄,用著也還可以。但更深刻來想,之所以養成這樣的用戶習慣,是因為我們的教育根源。教育系統從娃娃抓起,用小學中學大學十幾年的時間,訓練了用戶 Word 的使用習慣。到工作中,老員工又會帶著新員工繼續使用 Word,如此行程技術影響力生生不息的正向反饋。
?
回到我們今天的主題,我們來看 Jupyter Notebook。從 2017 年開始,已有大量的北美頂尖計算機課程,開始完全使用 Jupyter Notebook 作為工具。比如李飛飛的 CS231N《計算機視覺與神經網絡》課程,在 16 年時作業還是命令行 Python 的形式,但是 17 年的作業就全部在 Jupyter Notebook 上完成了。再如 UC Berkeley 的《數據科學基礎》課程,從 17 年起,所有作業也全部用 Jupyter Notebook 完成。
?
而 Jupyter Notebook 在工業界的影響力更甚。在 Facebook,雖然大規模的后臺開發仍然借助于功能齊全的 IDE,但是幾乎所有的中小型程序,比如內部的一些線下分析軟件,機器學習模塊的訓練都是借助于 Jupyter Notebook 完成的。據我了解,在別的硅谷一線大廠,例如 Google 的 AI Research 部門 Google Brain,也是清一色地全部使用 Jupyter Notebook,雖然用的是他們自己的改進定制版,叫 Google Colab。
?
看到這里,相信你已經認可了 Jupter Notebook 現如今的江湖地位。不過,說到技術的選擇,有些人會說,這個技術流行,我們應該用;有些人認為,阿里已經在用這個技術了,這就是未來,我們也要用等等。不得不說,這些都是片面的認知。不管是阿里還是 Facebook 用的技術,其實不一定適用你的應用場景。
?
我經常會鼓勵技術同行,對于技術選擇要有獨立的思考,不要人云亦云。最起碼你要去思考,Facebook 為什么選擇這個技術?這個技術解決了哪些問題?Facebook 為什么不選擇別的技術?有哪些局限?單從選擇結果而言,Facebook 選擇的技術很可能是因為它有幾百個產品線,幾萬個工程師。而同樣的技術,在一個十人的團隊里,反而成了拖累。
?
在這里,我不想忽悠你任何技術,我想教會你的是辯證分析技術的思考方法。接下來,我們就來看看,Jupyter 究竟解決了哪些別人沒有解決的問題。
?
Jupyter 的優點
?
1、整合所有的資源
?
在真正的軟件開發中,上下文切換占用了大量的時間。什么意思呢?舉個例子你就很好理解了,比如你需要切換窗口去看一些文檔,再切換窗口去用另一個工具畫圖等等。這些都是影響生產效率的因素。
?
正如我前面提到的,Jupyter 通過把所有和軟件編寫有關的資源全部放在一個地方,解決了這個問題。當你打開一個 Jupyter Notebook 時,就已經可以看到相應的文檔、圖表、視頻和相應的代碼。這樣,你就不需要切換窗口去找資料,只要看一個文件,就可以獲得項目的所有信息。
?
2、交互性編程體驗
?
在機器學習和數學統計領域,Python 編程的實驗性特別強,經常出現的情況是,一小塊代碼需要重寫 100 遍,比如為了嘗試 100 種不同的方法,但別的代碼都不想動。這一點和傳統的 Python 開發有很大不同。如果是在傳統的 Python 開發流程中,每一次實驗都要把所有代碼重新跑一遍,會花費開發者很多時間。特別是在像 Facebook 這樣千萬行級別的代碼庫里,即使整個公司的底層架構已經足夠優化,真要重新跑一遍,也需要幾分鐘的時間。
?
而 Jupyter Notebook 引進了 Cell 的概念,每次實驗可以只跑一小個 Cell 里的代碼;并且,所見即所得,在代碼下面立刻就可以看到結果。這樣強的互動性,讓 Python 研究員可以專注于問題本身,不被繁雜的工具鏈所累,不用在命令行直接切換,所有科研工作都能在 Jupyter 上完成。
?
3、零成本重現結果
?
同樣在機器學習和數學統計領域,Python 的使用是非常短平快的。常見的場景是,我在論文里看到別人的方法效果很好,可是當我去重現時,卻發現需要 pip 重新安裝一堆依賴軟件。這些準備工作可能會消耗你 80% 的時間,卻并不是真正的生產力。
?
Jupyter Notebook 如何解決這個問題呢?
?
其實最初的 Jupyter Notebook 也是挺麻煩的,需要你先在本機上安裝 IPython 引擎及其各種依賴軟件。不過現在的技術趨勢,則是徹底云端化了,例如 Jupyter 官方的 Binder 平臺(介紹文檔:https://mybinder.readthedocs.io/en/latest/index.html)和 Google 提供的 Google Colab 環境(介紹:https://colab.research.google.com/notebooks/welcome.ipynb)。它們讓 Jupyter Notebook 變得和石墨文檔、Google Doc 在線文檔一樣,在瀏覽器點開鏈接就能運行。
?
所以,現在當你用 Binder 打開一份 GitHub 上的 Jupyter Notebook 時,你不需要安裝任何軟件,直接在瀏覽器打開一份代碼,就能在云端運行。
?
4、Jupyter Notebook 初體驗
?
學習技術的最好方法就是用技術。不過,在今天的篇幅里,我不可能帶你完全學會 Jupyter Notebook 的所有技巧。我想先帶你直接感受一下,使用 Jupyter Notebook 的工作體驗。
?
比如這樣一個GitHub 文件。在Binder中,你只要輸入其對應的 GitHub Repository 的名字或者 URL,就能在云端打開整個 Repository,選擇你需要的notebook,你就能看到下圖這個界面。
每一個 Jupyter 的運行單元都包含了 In、Out 的 Cell。如圖所示,你可以使用 Run 按鈕,運行單獨的一個 Cell。當然,你也可以在此基礎上加以修改,或者新建一個 notebook,寫成自己想要的程序。趕緊打開鏈接試一試吧!
?
另外,我還推薦下面這些 Jupyter Notebook,作為你實踐的第一站。
?
第一個是 Jupyter 官方:https://mybinder.org/v2/gh/binder-examples/matplotlib-versions/mpl-v2.0/?filepath=matplotlib_versions_demo.ipynb
第二個是 Google Research 提供的 Colab 環境,尤其適合機器學習的實踐應用:https://colab.research.google.com/notebooks/basic_features_overview.ipynb
如果你想在本地或者遠程的機器上安裝 Jupyter Notebook,可以參考下面的兩個文檔。
安裝:https://jupyter.org/install.html
運行:https://jupyter.readthedocs.io/en/latest/running.html#running
總結
?
這節課,介紹了 Jupyter Notebook,并告訴你它為什么日趨成為 Python 社區的必學技術。這主要是因為它的三大特點:整合所有的資源、交互性編程體驗和零成本重現結果。但還是那句話,學習技術必須動手實操。這節課后,希望你能自己動手試一試 Jupyter Notebook,后面我們的一些課程代碼,我也會用 Jupyter Notebook 的形式分享給你。
?
?
?
?