數據科學從業人員如何選擇 python IDE

前言

IDE 之爭在程序員之間有著悠久的歷史,這些爭論大多數是圍繞」開發大型項目」這一種應用場景展開的。而對於數據科學從業人員,尤其是研究模型原型的研究人員來說,這些爭論並不能提供多少有意義的參考信息,因為即便使用同一種語言和同一種 IDE ,做科學計算和做開發的工作流也是完全不同的。

對於一個做數據分析計算的人來說,他的編程環境最好能提供以下核心功能(按重要性排序):

  1. 強大的交互性
  1. 查看 dataframe
  1. qtconsole

這些東西對於做分析和計算的人來說很重要,但對於多數開發工程師來說都是無關緊要的,同樣的,IDE 為開發大型項目的人員提供的很多強大而方便的功能對於數據分析師來說意義也不大。因此,不能用同一套標準來衡量科學計算人員與開發工程師的編程環境。

目前在科學計算領域,根據對於 IDE 的討論意見,可以大致把從事科學計算的人分為兩類。第一類人缺乏自己的思考(或者他們曾經是程序員),全盤接受做開發的程序員們對於 IDE 的看法,甚至向別人推薦 vim;第二類人編程基礎較差,完全不折騰自己的計算環境,選擇擁抱那些對新手友好的 IDE。

很少有人從數據科學家真正的需求出發來評價與推薦各類 IDE,這正是本文要做的事情。

數據科學領域的編程語言主要是以下幾種(按使用人數排序):

  1. R
  1. Python
  1. matlab/octave
  1. Julia

除了 Python 之外,其它幾種語言都只有一個 IDE 可以用,沒必要糾結如何選擇。而 Python 作為一種泛用性很高的膠水語言有大量的 IDE 可供選擇,因此本文主要討論 Python 的 IDE。

考慮到數據計算中會遇到的各種情況,本文會推薦三種 Python IDE。每種 IDE 都有其適用的場合,第一個並不能替代後兩個。

pycharm

「用過 pycharm 你就不會再考慮別的 IDE 了」,凡是在網上有關於 Python IDE 的討論,下面必然有人回復這句話。但 pycharm 並不適合所有人。至少在推出 scientific mode 之前,pycharm 在科學計算領域根本沒有 spyder 方便。

現在的 pycharm 有三個主要缺點,一是慢,二是慢,三是慢。

當然除了慢之外,pycharm 幾乎全是優點,但是我還是不會無腦推薦 pycharm,因為大多數人根本用不到它一半的功能。做科學計算的人很少會創建結構複雜的大型工程文件,何況不少做科學計算的人還停留在把所有代碼塞到一個文件里的階段(這也是很多人喜歡 jupyter notebook 甚至把 jupyter notebook 當主力工具的原因),也不使用 debug 工具。

所以不是所有人都會用到 pycharm 的強大功能,如果硬體一般的話,完全沒必要等待半天開一個 pycharm 只為輸出 hello world,如果硬體不一般…pycharm 在簡單任務上也不能給使用者帶來什麼方便。

過去 pycharm 不能像 spyder 一樣方便地打開並查看dataframe 型變數的時候,我一度覺得 pycharm 還不如 spyder 好用,不過現在 pycharm Pro 版加入了 scientific mode,不僅可以以表格形式查看 dataframe,還可以在非 debug 模式下查看所有 local 變數的詳細信息

可以說有了 scientific mode 之後,pycharm 在查看變數這方面已經完全不輸給 spyder 了,除了不能使用 qtconsole,我想要的功能 pycharm 全部都有了。雖然它實在太卡太慢,但我還是經常使用它。

Rodeo

如果只是想在運行程序後以表格形式查看一下 dataframe 型變數,完全沒必要打開笨重的 pycharm,這裡我推薦一個叫 Rodeo 的輕量級 IDE:

可以看到它的界面布局和 Rstudio 一模一樣,相當於一個 Python 版的 Rstudio。當然它現在的功能還極其簡陋,簡陋到連工程都不能創建,也沒有 debug,唯一亮點在於它可以查看 dataframe:

比起 pycharm 和 spyder,Rodeo 的啟動速度非常快(因為簡陋),所以如果只是想查看 dataframe,可以選擇打開輕量級的 Rodeo。

Spyder

從第一次使用 spyder 開始,我就很推崇它獨特的功能。

現在有了 pycharm scientific mode 和 Rodeo,spyder 少了很多獨有的的優勢。論啟動速度,現在的 spyder 其實也沒比 pycharm 快到哪去;要查看 dataframe,直接打開比較輕便的 Rodeo即可;要 debug,spyder 其實沒有自己的 debug 功能,它的 debug 按鈕只是用來啟動 ipdb,跟 pycharm強大的 debug 功能比起來,ipdb 並不是一個很方便的東西,並且要使用 ipdb 並不需要打開一個笨重的 IDE。

儘管如此,spyder 在一些場景下依然是不可替代的。

在功能方面,spyder 比起 pycharm 最大的亮點是 spyder 里使用的是 jupyter qtconsole,而 pycharm 使用的是基於字元的 ipython。這兩者的唯一區別是,qtconsole 里可以顯示你用代碼繪製的圖像,像這樣:

如果不是批量繪圖的話,使用基於字元的 ipython 就夠了;但是做計算時常常需要批量繪製圖像進行比較,這個時候在 qtconsole 裡面進行批量繪圖是很方便的,而 spyder 裡面默認集成的就是 qtconsole 而不是普通的 Python shell 或基於字元的 ipython。

此外,spyder 里可以用 #%% 來把一段代碼變成一個 cell,類似於 jupyter notebook 和 Rmarkdown 里的chunk,但是每個 cell 的運行結果並不顯示在代碼下方而是顯示在 qtconsole 里,個人感覺這個功能比較雞肋。

除了功能,spyder 最大的優勢是其強大的交互性。

在 pycharm 中,每個 module 運行後會產生一些變數,如果此時運行另外一個 module,pycharm 會單獨給第二個 module 開闢一個變數空間,兩個 module 的變數不會被混合在同一個地方;而 spyder 中,每運行一個模塊,產生的變數都會被添加進同一個變數空間中,這些變數可以在 variable explore 中看到,並且每個模塊和每個送入 qtconsole 運行的命令都可以訪問當前變數空間里的所有變數。

spyder 的這種把所有模塊變數混到一起的特性,如果說得難聽點可以說它簡陋,但是這種簡陋在數據計算中可以帶來意想不到的方便和強大的交互特性。

因為在做數據計算時,我們大多數時候都要處理一個很大的矩陣或很大的表格型變數,這麼大的數據,無論是要讀取它還是要通過它計算出一些結果,耗費的時間都是比較長的。如果在一個 module 經過漫長時間運行完畢之後,我們想再寫大約十來行的簡單代碼來對當前變數空間的變數進行一些計算來驗證我們的想法,就可以直接在 spyder 里寫一個 module 並直接運行,並且 spyder 還有「運行選中部分」的快捷按鈕,這個十幾行的 module 甚至不用保存。在交互性計算方面,別的 Python IDE 都比不上 spyder,包括在網上號稱一旦用上就不想換的 pycharm。

spyder 還有最後一個優勢,那就是免費。

jupyter notebook

雖然本文討論的是 IDE,但如果這篇文章被轉載到一個流量很大的平台上,下面的評論里肯定有人尬膜 jupyter notebook,所以我覺得在最後還是有必要對過度推崇 jupyter notebook 的人進行一波理性勸說。

先說結論,jupyter notebook 作為一個工具沒有黑點,但許多人的打開方式有很大的問題。我十分不建議把 jupyter notebook 作為主力開發工具,因為這容易讓人養成兩個壞習慣:一是每寫一行代碼就要運行一下然後跳到下一個 cell,導致駕馭長代碼的能力越來越差;二是把所有代碼放在一個文件里,不利於養成模塊化和工程化的編程習慣。

jupyter notebook有名為 cell 的代碼塊,可以在裡面寫markdown,每個cell 的運行結果顯示在 cell 下方,整個 notebook 可以在隱藏代碼後輸出成 html 和 pdf,很適合用來做展示。

jupyter notebook 實際上使用的就是 jupyter qtconsole,如果不清楚什麼是qtconsole 也可以直接理解成 ipython,每個 cell 的代碼就相當於送進 ipython 的指令。因為使用的是 qtconsole,所以在安裝了 iRkernel 的前提下,jupyter notebook 支持 R 語言(還可以支持其它數十種語言)。

由於 jupyter notebook 中每個 cell 的運行結果都會保留在 cell 的下方,因此 jupyter notebook 很適合這樣使用:在第一個 cell 中 %run fileName.py ,然後在後面的 cell 中輸入別的 ipython 命令來得到互動式的結果,實際上相當於把 jupyter notebook 當做 ipython 來用,並且比命令行式的 ipython shell 更方便。

jupyter notebook 作為展示工具和交互工具都是很好用的,這也是為什麼越來越多的 IDE 和編輯器都開始在內部支持 jupyter notebook,但它的定位不應該是一個主力開發工具。

結論

明確自己的需求,在選擇工具這件事上,不要盲目接受別人的意見,包括本文。

在不同的應用場景下選擇最適合的工具。


2017/03/19 更新:

關於 R 語言的 IDE

前面說 R 語言只有一個專用 IDE,也就是 Rstudio,但是最近發現 visual studio 里其實已經加入了針對 R 語言的數據科學模式(由 RTVS 提供)。

VS 的科學模式有單獨的繪圖 pane 與變數查看功能,默認的 layout 類似於 Rstudio,但是可以更加自由地任意定製界面布局。

和 Rstudio 相比,visual studio 里的數據科學模式最令人眼前一亮的特點是它和 excel 的無縫互動。在 Rstudio 中,要查看一個 datafarme,通常的做法是在變數列表裡雙擊變數的名字,在 Rstudio 里以表格的形式將它打開;現在在 visual studio 中你不僅可以做到這件事,還可以在變數列表中的某個變數名右邊直接點擊」在excel中打開」這個選項,直接在 excel 中打開這個變數。

visual studio 不僅包含 Rstudio 的所有功能,作為宇宙第一 IDE,在項目資源管理、版本管理和調試等方面也都是非常強大的。可以說,自從提供了數據科學模式,visual studio 已經全方位吊打 Rstudio,變成了 R 語言在 windows 平台上最完美的 IDE。

PS:遺憾的是,visual studio 里的 Python 組件 PTVS 至今沒有提供類似 RTVS 的數據科學模式。有不少人在 github 上給 PTVS 提過 issue 希望增加變數查看功能,但開發者似乎認為這是個微不足道的小眾功能。我目前在考慮在 RTVS 中使用 rpy2 調用 Python,這樣就可以在寫 Python 的時候使用 visual studio 的數據科學模式了,等有空的時候試一下。

關於 jupyter notebook

因為 jupyter notebook 可以部署到伺服器,我就在想 jupyter notebook 是不是也可以用來搭建個人博客。上網一搜,發現確實有人用 jupyter notebook 配合 pelican 和 guthub pages 搭建了數據科學博客,比如 這個博客。


推薦閱讀:

4 個用於構建優秀的命令行用戶界面的 Python 庫
python3機器學習經典實例-第五章構建推薦引擎22
【Python3網路爬蟲開發實戰】1.4.1-MySQL的安裝
黃哥Python 轉載的霸氣文章"Yes, Python is Slow, and I Don』t Care"

TAG:數據分析 | Python | R編程語言 |