特别感谢 Brian Granger、Fernando Pérez 和 Robert Kern 对本文的指导!
无论是初学者还是更资深的数据科学家,Jupyter Notebook 都是最常用的数据科学工具之一:这种交互式环境不仅非常适合教学、学习与同侪分享,还能确保研究可复现。然而,当您逐步掌握如何使用 Notebook 的同时,您也会经常碰到 IPython。
在某些情况下,这两者似乎可以互换使用。当您想更深入了解时,您会认同这的确让人困惑:魔法命令是 Jupyter 还是 IPython 的一部分?保存与加载 Notebook 是 IPython 还是 Jupyter 的功能?
类似的问题,您大概可以一直问下去。
今天的博文旨在更直观地阐明二者的核心差异:不仅从各自的起源解释它们的关系,还会涉及哪些具体功能属于谁,从而帮助您更容易地区分两者!
另外,建议阅读 DataCamp 的Jupyter Notebook 终极指南,获取技巧与窍门、最佳实践、示例等更多内容。
IPython / Jupyter 的起源
要全面理解 Jupyter Notebook 是什么以及它与 IPython 的区别,先了解这两者在计算型笔记本的历史与未来中的位置会很有帮助。
计算型笔记本的起点:MATLAB、Mathematica 与 Maple
20 世纪 80 年代中期,The MathWorks(由 Jack Little、Steve Bangert 和 Cleve Moler 创立)发布了 MATLAB。
时间来到 80 年代末,准确地说是 1987 年。Theodore Gray 开始开发 Mathematica 的 notebook 前端,一年后对外发布。这个 GUI 允许交互式创建和编辑包含美观代码、排版文本以及一系列功能(如数学公式排版、图形、GUI 组件、表格和声音)的 notebook 文档。它也具备标准文字处理能力,例如实时多语言拼写检查。您可以将文档以幻灯片形式输出用于演示。
观察这类 notebook 的结构会立刻发现,它们依赖单元的层级结构来进行大纲与分节,这一点如今也出现在 Jupyter notebooks 中。
同样在 80 年代末的 1989 年,Maple 引入了首个 notebook 风格的 GUI。它包含在 Macintosh 平台的 4.3 版本中。随后在 1990 年推出了 X11 与 Windows 的新界面版本。这些早期的 notebook 激发并奠定了后来所谓“数据科学笔记本”的发展基础。
数据科学笔记本的兴起
Maple 与 Mathematica 之后,出现了许多计算型 notebook。本节将聚焦于促成数据科学笔记本崛起的那些工具。您会看到,其中一些 notebook 至今仍深受新手与经验丰富的数据科学家欢迎。
Sage Notebook
浏览器版的 Sage notebook 首发于 2000 年代中期,2007 年又发布了功能更强的新版本,支持用户账户并可将文档公开。其界面设计与 Google Docs 相似,因为 Sage notebook 的布局借鉴了 Google notebooks。
Sage notebook 的创建者曾表示,他们是 Mathematica notebooks 与 Maple 工作表的忠实用户。推动 Sage notebook 开发的其他动因包括:其一,开发者与 IPython 团队关系密切,且 Sage 的终端版就使用了 IPython。其二,曾有两名学生“尝试未果”为 IPython 提供 GUI。其三,“AJAX”(“Asynchronous JavaScript And XML”的伪首字母缩写)的兴起,使得每次操作不再需要整页刷新。
比如在网站上填写表单:没有 AJAX 时,点击提交后会被重定向到由服务器返回新信息的新页面;有了 AJAX,JavaScript 会向服务器发起请求、获取结果并更新屏幕。您无需刷新,也不会被重定向。
其他您可能熟悉的 AJAX 应用还有 Gmail、Google 地图、Facebook、Twitter……可以说,几乎处处可见 AJAX。
IPython 与 Jupyter Notebook
2001 年底,距 Guido van Rossum 在荷兰国家数学与计算机科学研究所开始开发 Python 大约二十年后,Fernando Pérez 开始开发 IPython。与 Sage notebook 和后续许多项目一样,该项目受 Mathematica notebooks 与 Maple 工作表的深刻影响。
2005 年,首次尝试用 Wx(用于跨平台 GUI 的组件工具包与工具库)构建 notebook 系统。两名 Google Summer of Code 学生在 Robert Kern 与 Fernando Pérez 的指导下完成了原型。之后,Robert 又进一步推进。与其说是 notebook 原型,不如说是清理了 IPython 核心代码,以便更容易为 IPython shell 编写 wxPython GUI 前端。这些清理也助力了后续更干净的 notebook 系统的诞生,其中一些改动最终以碎片化方式合并进了 IPython,推动了 notebook 的成功落地。
第二个 IPython 原型由 Min Ragan-Kelley 在 2006 年夏完成,导师为 Brian Granger。它基于 Web,后端使用 SQL 数据库。但由于当时的 Web 技术实现过于复杂,工作被中止。
第三个 IPython notebook 原型出现在 2010 年 10 月,由第三方在数日内黑客式完成。最终,在 2011 年春夏之交,Brian Granger 全职开发基于 Web 的 notebook 原型,基础是他在 2010 年与 Fernando Pérez 一起创建的 IPython 内核架构与消息规范,以及与 Min Ragan Kelley 合作的 PyZMQ。
PyZMQ 是为 ZeroMQ 提供 Python 绑定的库;该库是 IPython 并行计算、qt 控制台与 notebook 功能所需。
PyZMQ 与 websockets 是促成 notebook 成为可能的关键技术。同年秋天,其他贡献者(如 Matthias Bussonnier、Min 和 Fernando)也开始参与。2011 年 12 月 21 日,第一版 IPython Notebook(0.12)正式发布。
随后几年,团队获得了诸多奖项,如 2013 年 3 月 23 日授予 Fernando Pérez 的自由软件推进奖、Jolt 生产力奖,以及来自阿尔弗雷德·P·斯隆基金会等机构的资助。
最终在 2014 年,Jupyter 项目作为 IPython 的衍生项目启动。
分家前的最后一个 IPython 版本将交互式 shell、notebook 服务器、Qt 控制台等都放在一个仓库中。项目规模庞大,而其中组件正逐渐演化为彼此独立的子项目,只是恰好归于同一伞形之下。
但请注意,项目规模并非启动 Jupyter 的唯一原因:从 2011 到 2014 年,IPython notebook 开始支持其他编程语言。第一个加入的是 Julia,此后是 R。名为“IPython”的 notebook 却能运行 Julia 与 R 等其他语言的内核,这让人困惑。
既然还有其他语言参与,为什么还叫“IPython”?
“Jupyter”这个名字的灵感来自科学计算领域的三大开放语言(Julia、Python 与 R)。尽管看似首字母缩写,它从未意味着排斥其他语言。更重要的是,这个名字更贴切地代表了开发者们所打造的项目,并向其科学根源致意!
Jupyter 项目启动后,IPython 项目中与语言无关的部分(如 notebook 格式、消息协议、Qt 控制台、notebook Web 应用等)被划归到Jupyter 项目。Jupyter 的主 GitHub 组织在这里。
在 Jupyter 与 IPython 社区中,这被称为“大分裂”(The Big Split)。
如今 IPython 只承担两项职责:作为 Jupyter Notebook 的 Python 后端(即内核),以及作为交互式 Python shell。但不止于此:在 IPython 生态中,您还会发现一个并行计算框架。稍后您会读到更多!
与 IPython 类似,Jupyter 项目实际上也是一系列子项目的统称:其下包含 Notebook 本身、Console 与 Qt console 等应用,还包括支持 Notebook 部署的 JupyterHub、面向教育用途的 nbgrader 等子项目。您可以在这里查看 Jupyter 架构概览。
需要指出,正是这种演进导致许多 Python 开发者对 IPython 与 Jupyter 感到困惑:由于二者相互衍生(而且时间并不久远),一些人仍难以用准确名称指代概念。更复杂的是演化本身:由于一者源于另一者,IPython 与 Jupyter Notebook 的功能存在显著重叠,有时不易区分!如何区分将在下文明确说明。若想了解 IPython 的更多发展细节,可阅读 Fernando Pérez 与 William Stein 关于其 notebook 历史的个人记述。
R Notebooks
R Markdown 与 Jupyter Notebook 都旨在提供可复现的工作流,将代码、输出与文本编织到单一文档中,支持交互式控件,并可输出为多种格式。
但二者也有差异:前者侧重可复现的批处理执行、纯文本表示、版本控制与生产级输出,并提供与您编写 R 脚本相同的编辑器与工具。后者更注重与代码内联输出、跨会话缓存输出、在单个文件中共享代码与输出。Notebooks 强调交互式执行模型。它们不是纯文本表示,而是结构化数据表示,如 JSON。
这也解释了 RStudio 笔记本应用的目标:它将 R Markdown 的全部优势与计算型笔记本的优点结合起来。
想了解如何使用 R notebooks,以及在共享、项目管理、版本控制等方面 Jupyter 与 R Markdown notebooks 的具体差异,请查看 DataCamp 的Jupyter 与 R:使用 R 的 Notebooks一文。
其他数据科学笔记本
当然,当您入门数据科学时,还有更多 notebook 可供考虑。近年来,许多新替代品走进数据科学家的视野:不仅有 Beaker Notebook、Apache Zeppelin、Spark Notebook、DataBricks Cloud 等,还有诸如 Rodeo IDE 或 nteract 之类同样能让数据科学分析更具交互性与可复现性的工具。值得注意的是,nteract 与此处提到的其他工具不同之处在于它采用了 Jupyter 架构(如协议与格式)。
笔记本的未来
笔记本似乎将长期存在。最近,下一代 Jupyter Notebook——JupyterLab——已面向社区推出。该应用不仅支持 Notebooks,还包含文件管理器、文本编辑器、终端模拟器、Jupyter 进程监视器、IPython 集群管理器以及用于显示帮助的分页器。
您也许会觉得这并不新鲜;Jupyter Notebook 同样具备这些组件。然而,JupyterLab 让您可以以全新的方式使用所有这些交互式计算的构件。
在这里了解更多。
Jupyter Notebook 的丰富工具集是在用户与开发者需求的推动下有机演进而来。JupyterLab 则是为支持所有这些工具而打造的下一代架构,具备灵活、响应式的 UI,提供由用户掌控的布局,将这些工具有机串联起来。
IPython 还是 Jupyter?
项目的演进与随之而来的“大分裂”是理解二者真正差异的基础。但由于两者本质上紧密相连,您有时仍会对哪些功能属于谁感到犹疑。
下面将介绍一些功能,它们要么属于 IPython 生态,要么属于 Jupyter 项目。
由您来选择正确归属,并顺带进一步了解每个功能!
内核(Kernels)?
尽管内核如今在 Jupyter Notebook 应用中占据显著位置,但第一个完整使用内核与协议的工具是 Notebook 之前开发的 Qt console。如今,Notebook 在历史与架构上都灵活利用内核,而内核是 Jupyter 的特性而非 Notebook 的特性。这意味着内核远不止一个功能点:它们是 Jupyter 架构的核心抽象,并被非 Notebook 工具使用,如文本控制台、Qt console、O’Reilly 的 Thebe、Kernel Gateway 工具、nteract 的 hydrogen 编辑器。最后,在 JupyterLab 中,内核还可连接到从 notebook 到 Web 控制台乃至文本文件等一切对象。
内核是一个运行并自省用户代码的程序:它为前端界面(如 notebooks)提供计算与通信能力。Jupyter Notebook 应用的三个主要内核是 IPython、IRkernel 与 IJulia。
鉴于“Jupyter”名称源自科学领域的三大开源语言(Julia、Python 与 R),这并不令人意外。IPython 内核由 Jupyter 团队维护,这也是项目演进的结果。
不过,您也可以在 Jupyter Notebook 应用中运行其他许多语言,如 Scala、JavaScript、Haskell、Ruby 等。这些是社区维护的内核。
Notebook 部署?
当您使用 Jupyter notebooks 时,通常会关注如何部署。Jupyter 生态中有不少用于部署 notebooks 的软件包。
以下是其中一些:
docker-stacks:当您需要将 Jupyter 应用与内核打包为 Docker 容器的栈时非常有用。ipywidgets:为 Jupyter 架构提供交互式 HTML 与 JavaScript 小部件(如滑块、复选框、文本框、图表等),将前端控件与 Jupyter 内核联动。jupyter-drive:允许 IPython 使用 Google Drive 进行文件管理。jupyter-sphinx-theme:为您的 notebook 添加 Jupyter Sphinx 主题,更轻松地创建智能而美观的文档。kernel_gateway:一个支持以不同机制启动并与 Jupyter 内核通信的 Web 服务器。请查看这里了解适用场景。nbviewer:用于分享您的 notebooks。访问这里查看画廊。tmpnb:使用 Docker 容器创建临时 Jupyter Notebook 服务器。可在这里亲自试用。traitlets:让 Python 类具备类型检查、动态计算默认值与“值变更”回调的属性框架。您也可用于配置,从文件或命令行参数加载值。traitlets 为 IPython 与 Jupyter 的配置系统以及 IPython 交互式小部件的声明式 API 提供支持。
系统 Shell 用法?
可以通过“shell 转义”将 IPython 用作系统 shell:以 ! 开头的行会直接传递给系统 shell。例如,!ls 会在当前目录运行 ls。您可以用 myfiles=!ls 的语法将系统命令的结果赋给 Python 变量。不过,如果您想将 ls 的结果直接打印为字符串列表而不赋值给变量,请使用两个感叹号(!!ls)或不带赋值的 %sx 魔法命令。
# Assign the result to `ls`
ls = !ls
# Explicit `ls`
!!ls
# Or with magics
%sx
# Assign magics result
ls = %sx
注意,!! 命令不能赋值给变量,但返回值的魔法命令结果可以赋值给变量。
IPython 还允许您在进行系统调用时展开 Python 变量的值:将变量或表达式包裹在花括号({})中即可。此外,在以 ! 或 !! 开头的 shell 命令中,任何以 $ 为前缀的 Python 变量都会被展开。在下面的代码块中,您会看到我们回显了 sys 变量的 argv 属性。注意,您也可以使用 $/$$ 语法从系统输出中传回 Python 变量,供后续脚本使用。
要向 shell 传递字面量 $,请使用双 $$。当您要访问 $PATH 等 shell 与环境变量时就需要这个字面量 $:
# Import and initialize
import math
x = 4
# System call with variable
!echo {math.factorial(x)}
# Expand a variable
!echo $sys.argv
# Use $$ for a literal $
!echo "A system variable: $$HOME"
在这里阅读更多。
请注意,除了 IPython,还有其他内核也提供特殊语法来确保将某些行作为 shell 命令执行!从最严格意义上讲,这些并不是真正的“魔法命令”,因为它们可以用任意名称实现,且可能与 IPython 的魔法命令完全不同(或更丰富或更简约)。
此外,您可以为系统命令定义别名。别名本质上是 bash 命令的快捷方式。一个别名是一个元组:(“showTheDirectory”,“ls”)。运行 %alias? 获取更多信息!
提示:使用 %rehashx 将您的 $PATH 全部加载为 IPython 别名。
魔法命令(Magics)?
如果您读过 DataCamp 的Jupyter Notebook 终极指南,或已使用过 Jupyter,您可能已经了解所谓的“魔法命令”。魔法命令通常由在底层语言中无效的语法元素与某个代表命令的词构成。其底层其实是 Python 函数。
如您所知,IPython 内核使用的是 % 语法元素,因为它不是 Python 中有效的一元运算符。而以 %% 开头的行表示单元魔法(cell magic):它不仅接收当前行的其余部分,还会接收当前执行块中其下方的所有行作为参数。单元魔法可以对接收的输入进行任意修改,它甚至可以不是有效的 Python 代码。它们会将整个代码块作为单一字符串接收。
魔法命令由内核提供并特定于内核,旨在让您在 Jupyter Notebook 中的工作更具交互性与便捷性。某个内核是否提供魔法命令,取决于该内核的开发者,且各内核不同。您已经看到了:魔法命令是内核特性。
当您使用 Jupyter Notebook 的 Python 后端(即 IPython,也称内核)时,您可能希望用以下技巧来获取能让编程更快、更易、更具互动性的功能。注意,下列清单并不穷尽。完整列表请查看内置魔法命令清单。
绘图
IPython 内核的一大特性是能够显示由代码单元运行产生的图形。该内核与数据可视化库 matplotlib 无缝协作以提供此功能。要使用它,请调用魔法命令 %matplotlib。
默认情况下,您的图将显示在单独窗口中。此外,您也可以指定后端,如 inline 或 qt,则绘图命令的输出将以内联或其他 GUI 后端的方式展示。详情可在这里阅读。
文件系统导航
内核的魔法命令也提供了在文件系统中导航的方式。%cd 与 %bookmark 可用于切换目录或为常用文件夹加书签,以便更快访问。
调试器访问
接着,您还可以使用魔法命令在每次出现未捕获异常时调用 Python 调试器 %pdb。它会引导您定位触发异常的代码位置,从而更快找到 Bug 的根源。
您也可以在 %run 魔法命令中使用 -d 选项,在 Python 调试器控制下运行脚本。它会自动为您设置初始断点。最后,您还可以使用 %debug 魔法以更便捷地访问调试器。
IPython 扩展
您可以使用 %load_ext 通过模块名加载 IPython 扩展。IPython 扩展是修改 shell 行为的 Python 模块:扩展可以注册魔法命令、定义变量,并总体上修改用户命名空间,以便在代码单元中提供新功能。示例包括:
- 使用
%load_ext oct2py.ipython从 Python 无缝调用 M 文件与 Octave 函数, - 使用
%load_ext rpy2.ipython在嵌入 Python 进程中运行 R 的接口, - 使用
%load_ext Cython启用 Python 到 C 的编译器, - 使用
sympy.init_printing()自动美观打印 Sympy Basic 对象, - 在交互式会话中使用 Fortran,可用
%load_ext fortranmagic。
……还有很多!您可以创建并在 PyPi 上注册自己的 IPython 扩展:这也意味着还有许多用户自定义的扩展与魔法命令!一个示例是 ipython_unittest,另外也可查看这个扩展索引。
另一个值得关注的扩展示例是 sparkmagic,它是一套通过 Livy(Spark 的 REST 服务器)在 Jupyter notebooks 中交互式使用远程 Spark 集群的工具。sparkmagic 库提供了 %%spark 魔法,可让您在普通 IPython notebook 中轻松对远程 Spark 集群运行代码。
# Load in sparkmagic
%load_ext sparkmagic.magics
# Set the endpoint
%manage_spark
# Ask for help
%spark?
前往这里查看更多如何使用这些魔法命令交互式操作 Spark 集群的示例。
注意,除 %load_ext 外,IPython 还有另外两个魔法命令可在 Jupyter Notebook 内管理扩展:%reload_ext 与 %unload_ext,分别用于卸载后重载与卸载扩展。
不同内核,不同魔法命令
然而,在其他语言中,魔法命令的语法元素可能本身就有意义。R 内核 IRKernel 并没有魔法命令系统。比如要执行 bash 命令,您会使用 R 函数 system() 来调用操作系统命令。例如 system("head -5 *.csv", intern=TRUE)。注意,包含 intern 参数表示您希望以 R 字符向量捕获命令输出。要显示 Markdown 输入,使用 display_markdown() 并传入 Markdown 代码的字符向量。同样,Julia 内核 IJulia 也不使用“魔法命令”。相反,Julia 中更自然的其他语法可以实现相同目标,且能在 IJulia 代码单元之外的环境中工作,通常也更强大。不过,IJulia 的开发者确保:当您在 IJulia 代码单元中输入 IPython 的魔法命令时,会打印出帮助,尽可能解释在 Julia 中如何实现类似效果。
例如,IJulia 中对应于 IPython %load 的是 IJulia.load()。
另一方面,也有像 Scala 内核 IScala 这样的内核,类似于 IPython 支持魔法命令。但其魔法命令集合会不同,以匹配 Scala 与 JVM 的特性。魔法命令由百分号 % 加标识符与可选输入构成。一些值得注意的魔法命令有:
# Type Information
%type 1
# Library Management
%libraryDependencies
%update
如上文所述,sparkmagic 库还提供一组 Scala 与 Python 内核,让您无需编写任何代码,即可自动连接远程 Spark 集群、运行代码与 SQL 查询、管理 Livy 服务器与 Spark 作业配置,并自动生成可视化。
例如,您可以使用 %%sql 轻松执行 SparkSQL 查询,或通过 %%info 魔法访问 Spark 应用信息与日志。
如果您在使用其他内核并想知道能否使用魔法命令,了解这一点会很有帮助:有些内核构建于 metakernel 项目之上,通常会使用与 IPython 内核中相同的魔法命令。metakernel 的魔法命令列表在这里。metakernel 是一个 Jupyter/IPython 内核模板,包含核心魔法函数。
一些示例:
- MATLAB 内核
matlab_kernel, - Octave 内核
octave_kernel, - Java9 内核
java9_kernel, - Wolfram 内核
wolfram_kernel, - SAS 内核。……还有更多!
这意味着,例如当您使用 MATLAB 内核时,将会拥有如下魔法命令:
Available line magics:
%cd %connect_info %download %edit %get %help %html %install %install_magic %javascript %kernel %kx %latex %load %ls %lsmagic %magic %parallel %plot %pmap %px %python %reload_magics %restart %run %set %shell %spell
Available cell magics:
%%debug %%file %%help %%html %%javascript %%kx %%latex %%processing %%px %%python %%shell %%show %%spell
如果您查看上面打印的内容,会发现其中一些魔法命令非常眼熟。对不熟悉魔法命令的人来说,不妨将上面这段与 IPython 内核默认可用的魔法命令对比,会发现部分命令是相同的:
Available line magics:
%alias %alias_magic %autocall %automagic %autosave %bookmark %cat %cd %clear %colors %config %connect_info %cp %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %killbgscripts %ldir %less %lf %lk %ll %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %lx %macro %magic %man %matplotlib %mkdir %more %mv %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %rm %rmdir %run %save %sc %set_env %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode
Available cell magics:
%%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%js %%latex %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile
本质上,您可以通过一个问题来区分哪些魔法命令特属 IPython,哪些可用于其他内核:该功能是否特定于 Python,或是否属于您所用语言也能使用的通用功能?
例如,%pdb(Python 调试器)或 %matplotlib 都是 Python 特定功能,在 JavaScript 内核中并无意义。而 %cd 切换目录通常非常通用,应该适用于任何语言,因为它是非常“通用”的命令。所以,这类魔法命令很可能可用于其他内核。当然,前提仍是您的内核支持魔法命令。
Notebook 的转换与格式化?
Notebook 的转换与格式化是您会在 Jupyter 生态中找到的功能。常用于这些任务的两个工具是 nbconvert 与 nbformat。
您可以使用前者将 notebook 转换为其他多种格式,以便用熟悉的形式呈现信息、发表研究、在论文中嵌入 notebook、与他人协作并与更广泛的受众分享内容。
后者则基本上定义了 Jupyter Notebook 的格式,它是理解 notebook 文件为何是简单 JSON 文档的关键:它包含元数据(如内核或语言信息)、notebook 格式的主次版本号,以及存储所有文本、代码等内容的各个单元。
保存与加载 Notebook?
保存与加载 notebooks 是 Jupyter Notebook 应用的功能。您可以加载他人创建并以 .ipynb 扩展名保存的 notebooks,只需下载该文件并在 Jupyter 应用中打开即可。具体而言,您可以新建一个 notebook,然后点击“File”选项卡,点“Open”,选择下载的 notebook 文件打开。
反过来,您也可以点击同一个“File”选项卡,选择“Download as”获取自己的 notebook 文件,或者选择保存文件并设置检查点。这对进行轻量的版本控制、回退到较早版本很实用。当然,您的修改每隔几分钟会自动保存,因此并不总是需要手动执行这些操作。
注意,您也可以选择不在原始 notebook 上保存任何改动,而是先创建一个副本,将所有修改保存在副本中!
键盘快捷键与多光标支持?
选择多个单元、切换单元输出、插入新单元等操作,都有属于 Jupyter Notebook 的键盘快捷键。您可以在顶部菜单的“Help”选项卡下选择“Keyboard Shortcuts”查看列表。
此外,多光标支持也是 Jupyter Notebook 的一项功能!
并行计算网络?
并行计算网络曾是 IPython 项目的一部分,但自 4.0 起作为独立软件包 ipyparallel 发布。该包基本上是一组用于控制 Jupyter 集群的 CLI 脚本。
尽管已拆分出去,但它仍是 IPython 生态中常被忽视的强大组件;其强大之处在于它允许您在多台机器上启动多个分布式内核,而不是只运行单个 Python 内核。
ipyparallel 的典型用例包括需要多次运行模型以估计输出分布或评估其随输入参数变化而变化的情况。当模型的每次运行彼此独立时,您可以通过在集群的多台计算机上并行运行来加速过程。参见分布式模型训练或仿真。
终端?
这是 Jupyter 生态中的一项功能:您拥有 Jupyter Console 与 Jupyter 终端应用。不过,从一开始,IPython 就用于指代原始的交互式 Python 命令行终端。它提供增强的 REPL 环境,尤其适合科学计算。这是 2011 年 Notebook 工具出现之前的标准方式,后者为 Python 带来了现代且强大的 Web 界面。
随后,还有 IPython 控制台,它会启动两个进程:原始 IPython 终端 shell 与默认配置文件或内核(若未另行指定)。默认情况下,这是 Python。如今 IPython 控制台已弃用,如需启动,您需要使用 Jupyter Console,它是基于终端的 Jupyter 内核前端。该代码基于单进程的 IPython 终端。Jupyter Console 在终端中提供 IPython 的交互式客户端体验,但可连接任意 Jupyter 内核,而非仅限于 IPython。这让您无需启动完整的 Notebook,即可在终端中测试任何已安装的 Jupyter 内核。Console 允许基于控制台与其他 Jupyter 内核(如 IJulia、IRKernel)交互。
最后,Jupyter Notebook 应用还提供终端应用:在浏览器中运行的简易 bash shell。启动应用后,在下拉菜单中选择新建终端即可找到。
Qt Console?
Qt console 曾是 IPython 项目的一部分,但现在已并入 Jupyter 项目。它是一个轻量应用,整体感觉类似终端,但提供了仅在 GUI 中才可能实现的一系列增强功能,如内联图形、带语法高亮的规范多行编辑、图形化参数提示等。Qt console 可使用任意 Jupyter 内核。
结语
本文是对 DataCamp 终极指南的补充,更详细地回顾了计算型笔记本的历史,并梳理了 IPython 与 Jupyter 项目的主要特性,帮助您更清晰地理解二者的演进与差异。我们的目标是让您看到:如果不结合这两个项目的历史视角,二者的区分有时确实不容易。在一些情况下,还存在不易界定的灰色地带。