作者:vivianchen1988 | 来源:互联网 | 2023-08-11 01:47
本文首发于我的个人博客程序员的IDE之争有着悠久的历史,但是这些争论大多数是围绕”开发大型项目”这一种应用场景展开的,而对于数据科学从业人员,尤其是研究数据模型原型的研究人员来说,
本文首发于我的个人博客
程序员的 IDE 之争有着悠久的历史,但是这些争论大多数是围绕”开发大型项目”这一种应用场景展开的,而对于数据科学从业人员,尤其是研究数据模型原型的研究人员来说,这些争论并不能提供多少有意义的参考信息,因为即便使用同一种语言和同一种 IDE ,做科学计算和做开发的工作流也是完全不同的。
对于一个做数据分析计算的人来说,他的 IDE 最好能提供以下核心功能(按重要性排序):
- 强大的交互性
- 查看 dataframe
- qtconsole
这些东西对于做数据分析和建模的人来说很重要,但对于多数开发工程师来说都是无关紧要的;同样的,IDE 为开发大型项目的工程师提供的很多强大而方便的功能对于数据分析师来说也只是一个锦上添花的东西而已。因此,不能用同一套标准来衡量科学计算人员与开发工程师的编程环境。
根据对于 IDE 的讨论意见,可以大致把做数据分析和科学计算的人分为两类。第一类人缺乏自己的思考(或者他们曾经是程序员),全盘接受做开发的程序员们对于 IDE 的看法,甚至人云亦云地向别人推荐 vim/emacs;第二类人编程基础较差,完全不折腾自己的计算环境,选择拥抱那些对新手友好的 IDE。
很少有人从数据科学家真正的需求出发来评价与推荐各类 IDE,这正是本文要做的事情。
Table of Contents
- pycharm
- Rodeo
- Spyder
- jupyter notebook
- 结论
目前数据科学领域的编程语言主要是以下几种(按使用人数大致排序):
- R
- Python
- matlab/octave
- Julia
在这些语言中,Python 通用性最强,所以在 Python 社区里码农们的声音比较大,利用 Python 做计算的新手很容易被程序员们带偏,所以本文主要讨论 Python 的 IDE。
考虑到数据计算中会遇到的各种情况,本文主要推荐三种 Python IDE。每种 IDE 都有其适用的场合,第一个并不能替代后两个。
pycharm
“用过 pycharm 你就不会再考虑别的 IDE 了”,凡是在网上有关于 Python IDE 的讨论,下面必然有人回复这句话。但 pycharm 并不适合所有人。至少在推出 scientific mode(科学模式) 之前,pycharm 在科学计算领域根本没有 spyder 方便。过去 pycharm 不能像 spyder 一样方便地打开并查看dataframe 型变量:
spyder variable
在老版本 pycharm 只能在 debug 模式下查看没有列名的 dataframe 的时候,我一度觉得 pycharm 还不如 spyder 好用,不过现在 pycharm Pro 版加入了 scientific mode,不仅可以以表格形式查看 dataframe,还可以在非 debug 模式下查看所有变量和对象的详细信息:
pycharm scientific 0
pycharm scientific 1
有了 scientific mode 之后,pycharm 在查看变量这方面基本不输给 spyder 了,虽然不能使用 qtconsole,但 pycharm 在功能上的其它优点(比如 jetbrains 杀手级的静态语法检查)完全可以把这一点点小缺陷弥补回来。只从功能上说,pycharm 的确碾压其它工具,除了冷启动慢和占用内存比较大之外,pycharm 在功能上可以说几乎全是优点。
但是,我还是不会无脑推荐 pycharm。首先,pycharm 是一个商业收费软件,免费的社区版 pycharm 没有科学模式;另一方面,做数据计算的人根本用不到它哪怕一半的功能。做数据计算的人很少会创建结构复杂的巨型工程文件,也不使用 debug 工具,更何况不少做数据计算的人还停留在把所有代码塞到一个文件里的阶段(这也是很多新手喜欢 jupyter notebook 甚至把 jupyter notebook 当主力工具的原因)。既然不是所有人都会用到 pycharm 的强大功能,完全没必要等待半天开一个 pycharm 只为输出 hello world;另外,pycharm 复杂的界面和强大的功能很容易激起探索欲,这一探索,手上的活一点都没干,一整天的时间就这么耗过去了。
Rodeo
如果只是想在运行程序后以表格形式查看一下 dataframe 型变量,完全没必要打开内存杀手 pycharm,这里我推荐一个叫 Rodeo 的轻量级 IDE:
Rodeo main
可以看到它的界面布局和 Rstudio 一模一样,相当于一个 Python 版的 Rstudio。当然它现在的功能还极其简陋,简陋到连工程都不能创建,也没有 debug 工具,唯一亮点在于它可以查看 dataframe:
Rodeo dataframe
比起 pycharm 和 spyder,Rodeo 的启动速度非常快(因为简陋),所以如果你只有查看 dataframe 这一个需求,可以选择轻量级的 Rodeo。
Spyder
从第一次使用 spyder 开始,我就很推崇它独特的功能,比如,spyder 在所有针对科学计算的 IDE 里第一个使用 qtconsole,它也是第一个可以以表格形式查看 numpy 和 pandas 对象的 python IDE;现在有了 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 里可以显示你用代码绘制的图像,像这样:
qtconsole
如果不是批量绘图的话,使用基于字符的 ipython 就够了;但是做计算时常常需要批量绘制图像进行比较,这个时候在 qtconsole 里面进行批量绘图是很方便的,而 spyder 里面默认集成的就是 qtconsole 而不是普通的 Python shell 或基于字符的 ipython。
此外,spyder 里还可以可以用 #%%
来把一段代码变成一个 cell,类似于 jupyter notebook 和 Rmarkdown 里的chunk,但是每个 cell 的运行结果并不显示在代码下方而是显示在 qtconsole 里,个人感觉这个功能比较鸡肋,但新手可以用这个功能比较方便地进行一些交互式尝试。
除了一些独有功能,spyder 最大的优势是其强大的交互性。
在 pycharm 中,每个模块运行后会产生一些变量,如果此时运行另外一个模块,pycharm 会单独给第二个 module 开辟一个变量空间,两个 module 的变量不会被混合在同一个地方;而 spyder 中,每运行一个模块,产生的变量都会被添加进同一个变量空间中,这些变量可以在 variable explore 中看到,并且每个模块和每个送入 qtconsole 运行的命令都可以访问当前变量空间里的所有变量。
spyder 的这种把所有模块变量混到一起的特性,如果说得难听点可以说它简陋,但是这种简陋在数据计算中可以带来意想不到的方便和强大的交互特性。
因为在做数据计算时,我们大多数时候都要处理一个很大的矩阵或很大的表格型变量,这么大的数据,无论是要读取它还是要通过它计算出一些结果,耗费的时间都是比较长的。如果在一个 module 经过漫长时间运行完毕之后,我们想再写大约十来行的简单代码来对当前变量空间的变量进行一些计算来验证我们的想法,就可以直接在 spyder 里写一个模块并直接运行,并且 spyder 还有“运行选中部分”的快捷按钮,这个十几行的 module 甚至不用保存。在交互性计算方面,别的 Python IDE 都比不上 spyder,包括在网上号称一旦用上就不想换的 pycharm。
spyder 还有最后一个优势,那就是免费。总的来说,如果不购买 pycharm(免费的 pycharm 社区版是没有科学模式的),spyder 仍然是 python 做科学计算的最佳 IDE
jupyter notebook
虽然本文讨论的是 IDE,但如果这篇文章被很多人阅读,下面的评论里肯定有人尬膜 jupyter notebook,所以我觉得在最后还是有必要对过度推崇 jupyter notebook 的人进行一波理性劝说。
先说结论,jupyter notebook 作为一个工具没有黑点,但许多人的打开方式有很大的问题。我十分不建议把 jupyter notebook 作为主力开发工具,因为这容易让人养成两个坏习惯:一是每写一行代码就要运行一下然后跳到下一个 cell,导致驾驭长代码的能力越来越差;二是把所有代码放在一个文件里,不利于养成模块化和工程化的编程习惯。
当然 jupyter 在功能上有一些特色,不过我个人并不觉得这些功能是真正击中了痛点的:
- jupyter notebook 主要由名为 cell 的代码块,可以在里面写 markdown(也支持 HTML),每个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,但它的定位不应该是一个主力开发工具。
结论
明确自己的需求,在选择工具这件事上,不要盲目接受别人的意见,包括本文。
在不同的应用场景下选择最适合的工具。
2018/03/19 更新:
Visual Studio 的科学模式
我在前面说 R 语言只有一个专用 IDE,但是最近发现 visual studio 里面加入了针对 R 语言的数据科学模式(由 RTVS 提供),有单独的绘图 pane 与变量查看功能,默认的 layout 类似于 Rstudio,但是可以更加自由地定制。
和 Rstudio 相比,visual studio 里的数据科学模式最令人眼前一亮的特点是它和 excel 的完美互动。在 Rstudio 中,要查看一个 datafarme,通常的做法是在变量列表里双击变量的名字,在 Rstudio 里以表格的形式将它打开;现在在 visual studio 中你不仅可以做到这件事,还可以在变量列表中的某个变量名右边直接点击”在excel中打开”这个选项,直接在 excel 中打开这个变量。
除此之外,visual studio 作为宇宙第一 IDE,在项目资源管理、版本管理等方面都是非常方便的,这些功能在 Rtudio 里面基本没有。可以说,自从提供了数据科学模式,visual studio 已经变成了 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 和 github pages 搭建了数据科学博客,比如 这个博客。
2018/08/04 更新:
关于 R 语言的 IDE
偶然看到了 这篇文章 之后,才知道 R 语言竟然有这么多种简陋的IDE,确实长见识了。
当然那篇文章里列举的一堆 R IDE 里面真正好用的没几个,我现在可以很确定地做个总结(flag),截止到 2018-08-04,世界上真正比较好用的 R 语言开发环境只有以下几个,以下排名要分先后:
- Visual Studio
- Emacs
- Rstudio
- VSCode
改天单独写篇文章介绍一下它们。