工欲善其事,必先利其器。
TL; DL
- IDE 无所谓绝对的优劣,实际在于使用者的取向。对于入门者而言选择是至关重要的,在选择更高级、更完善的 IDE 的同时,要掂量好可能付出的学习成本。
- PyCharm、VS Code 好比高级厨房,厨具很齐备,能想到的基本可以做得到;而 Jupyter 系列好比私人作坊,工具虽少,却样样是个好帮手。
- PyCharm、VS Code 让人感觉更像在「做项目」,强调流程的整体性。Jupyter 系列则感觉更像在「写代码」,强调流程的独立性,往往是「拆箱即用」「用完即走」。以上错觉是由各自的特性引起的。
- 在数据科学这一领域,数据分析等偏业务的从业者可以选择 Jupyter 系列,数据挖掘、机器学习等偏工程类的可选择 Pycharm 和 VS Code。
I. PyCharm
Pycharm 是捷克软件公司 JetBrains 开发的一款受众广泛的 Python 编程 IDE,融合了语法高亮、项目管理、代码重构、单元测试、版本控制等重要功能。因为功能实在太多,学习成本也变得非常大。如果你曾经接触过 JetBrains 的其他产品,例如 IntelliJ Idea,那么这款 IDE 最适合不过了。当然如果没有也没太大关系,这款 IDE 也很适合有做过项目的人群,因为熟悉项目管理的一系列流程,哪怕说一天内上手也不在话下。
项目导向
拥有清晰的文件架构视图和非常好用的全文检索功能。
快速重构代码
右键 Refactor 点击或按下相应重构项(例如重命名、更改签名等)的快捷键,可以快速重构代码。
Debugging
单击代码行布置断点后,进入代码调试模式,就可以查看代码执行过程和变量了。
快捷键
快捷键是 IDE 的核心要义,对于提高 coding 效率有至关重要的作用。PyCharm 的 keymap 多而全,还支持自定义。
II. Jupyter
根据官方的介绍,“Jupyter Notebook(现已更名为 Jupyter)是个集成文本,集成了数学公式、代码和图形的可分享文本。”
Jupyter Notebook
因为简单、共享的特性,Jupyter Notebook 很快成为了数据处理不可或缺的工具,现在已然渗透在数据分析和机器学习的方方面面。其实,Jupyter Notebook 源于一个叫做文本化编程的概念,是由 Donald Knuth 在 1984 年提出的。他认为文本化的编程,是完全的文本和代码交错在一起,而不是分成两个独立的部分。代码文档是写给人看的,不是给电脑看的。 的确,这会给别人分析或者回溯你的代码提供很大的便利。
强交互
一旦写完代码,你便可以用时按下 Ctrl + enter
或者 Shift + enter
组合键来执行当前的代码片段。
JIT
当代码提交被执行后,IDE 会得到及时 (just-in-time) 响应,把结果附在当前单元格末尾。
模块化
Jupyter Notebook 的主要构成元素是单元格 (cells),它们除彼此之间仅有上下流转关系外,不会受到互相的约束,使得不同功能代码的独立性得到了保持。在 notebook 中,你可以自由地移动或改变单元格,来组织(运行)顺序或呈现形式。
“文武双全”
可以切换单元格的类型,例如选择 markdown 时,将启用 Markdown 语法下的文本编辑模式,这时候你围绕上下文和结果,随心所欲地完成创作;当选择 code 时,单元格中的任何内容将视为代码被 Python 解释器执行,你可以在这个模式下完成数据处理、图像制作等等。
社区友好
众多数据竞赛平台都支持运行 Jupyter 内核,极大方便竞赛参与者进行数据探索和迭代实验。
Jupyter Lab
根据官方介绍,“Jupyter Lab 是下一代的 Jupyter Notebook”。可见在未来 Lab 将取代 Notebook。
项目管理
与 Jupyter Notebook 不同的是,Jupyter Lab 增强了对项目这一概念的实现。任何有关项目管理的流程,都能在同一个窗口甚至一个栏目下找到并完成。
不得不说,这才让人有了 “Jupyter 就是 IDE” 的感觉。
III. Visual Studio Code
Visual Studio Code (VS Code) 是微软出品的轻量、可定制的开发软件,是一款属于 Visual Studio 系列的产品。因为极好的通用性和扩展性,加上本身打着大厂的铭牌,迅速在业界流行开来。
调和
VS Code 的主要特性和 Jupyter 和 PyCharm 的大部分特性一致,这里不再赘述。我们可以认为它就是两者的结合体。
IV. 总结一下
下面总结以上几款 IDE 比较受关注的点:
Jupyter Notebook | PyCharm | VS Code | Jupyter Lab | |||
---|---|---|---|---|---|---|
项目管理 | 文件视图 | 仅显示最近一级 | √ | √ | √ | |
变量视图 | 需要插件 | 仅限 debugger | 需要插件 | √ | ||
文件操作 | 全局检索/替换 | × | √ | √ | √ | |
新建/移动/删除 | √ | √ | √ | √ | ||
测试/Debug | × | √ | √ | √ | ||
版本控制/Git | 需要插件 | √ | √ | 需要插件 | ||
文本编辑 | 跳转 | × | √ | √ | × | |
插入光标 | 多点 | √ | √ | √ | √ | |
多行 | × | √ | √ | × | ||
检索/替换 | √ | √ | √ | √ | ||
词典/语法表达 | × | √ | √ | × | ||
纠正提醒 | × | √ | √ | √ | ||
代码补全 | 需要插件 | √ | √ | 需要插件 | ||
代码重构 | 冲突识别 | × | √ | √ | × | |
参考建议 | × | √ | √ | × | ||
采样/提取 | 需要插件 | √ | 需要插件 | 需要插件 | ||
快速修复 | × | √ | × | × | ||
代码分析 | 成员结构 | × | √ | × | √ | |
错误识别 | × | √ | √ | × | ||
参照关联 | × | √ | √ | × | ||
运行指定行 | × | √ | √ | × | ||
社区生态 | 话题数量多 | √ | √ | √ | × | |
更新/迭代快 | × | × | √ | × | ||
插件品类多 | 官方 | × | √ | √ | × | |
第三方 | × | × | √ | × | ||
其他 | 免费 | √ | × | √ | √ | |
即装即用 | 自动配置运行环境 | √ | × | √ | √ | |
占用资源小 | √ | × | × | √ | ||
多语言 | √ | 需要插件 | 需要插件 | √ | ||
自定义/个性化 | 外观 | 需要插件 | √ | √ | √ | |
字体 | × | √ | √ | × | ||
模板 | × | √ | √ | × | ||
快捷键 | × | √ | √ | × | ||
综合 | 加权得分 | = Σx(i) · p(i) / 0.1n | 3.3 | 8.2 | 8.6 | 4.7 |
V. 写在最后
说到底,工具真的没有优劣之分,好不好用的感受也因人而异。因此,没有一点必要为了此长彼短争执不下,甚至产生偏见和歧视。
工具不是目的,而是为目的服务。适合自己,那就行啦!