Jupyter Notebook

现在最热门的开发领域无疑是人工智能(AI)了,这直接带动了Python的热度。连全国计算机等级考试(NCRE)也已经将Python纳入了考试课程,取代了实行很多年的Visual FoxPro。吴军老师在《吴军的谷歌方法论》第48期答读者问中提到,对于计算机的初学者,他也建议学习Python,原因是Python对接AI和大数据分析的工具更容易些。作为一名普通的软件开发人员,我也希望能掌握一些开发AI的技术,来给一般的应用程序赋予一些AI的能力。Python语言断断续续学了好多年,也有一些基础,但总感觉和AI结合的不够,直到我了解并熟练掌握Jupyter Notebook。

Jupyter Notebook是什么

我们先来看看官方的定义

The Jupyter Notebook is an open-source web application that allows you to create and share documents that contain live code, equations, visualizations and narrative text. Uses include: data cleaning and transformation, numerical simulation, statistical modeling, data visualization, machine learning, and much more.

Jupyter Notebook 是一个开源的 Web 应用,它能让用户将可运行的代码、数学方程、可视化内容和说明文本等内容全部组合到一个易于共享的文档中,其用途包括数据清理和变换、数值模拟、统计建模、数据可视化、机器学习等。

GitHub 支持 Jupyter Notebook 的渲染NBViewer也支持渲染GitHub代码库中的Notebook,以及存储在其他地方的Notebook。

Jupyter官网展示了一份近期的用户数据,统计表明(数据)科学家和学生占到了一半以上的用户来源。开发者使用Jupyter Notebook的比例反而不是那么高。
users_of_notebook

Jupyter Notebook的一个重要目的是计算的可重复性reproducible)。对于数据科学家和学生来说,论文中实验的可重复性是至关重要的,这也是为什么他们才是Jupyter Notebook的主力用户。

Jupyter Notebook是如何工作的

Jupyter Notebook源自Fernando Perez发起的IPython项目。IPython 是一种交互式的shell,与普通的Python shell相似,但具有一些很好的功能(如语法高亮和代码补全)。Notebook的工作方式是将来自Web应用的消息发送给IPython内核(服务器后台运行的IPython应用程序)。内核执行代码,然后将结果返回给Notebook。整个架构如下图所示。
how_notebook_works

我在这篇博客中讲述了支持C#语言的交互式Shell。

这个架构的一个优点是Notebook服务器和内核是分开,因此可以在两者之间发送任何语言的代码。例如,早期的两个非Python内核分别是R语言和Julia语言。使用R内核时,用R编写的代码将发送给执行该代码的R内核,这与在IPython内核上运行Python代码完全一样。IPython Notebook已被改名,因为Notebook变得与编程语言无关。新的名称Jupyter由Julia、Python和R组合而成。

我最开始知道Jupyter时,经常把它和木星(Jupiter)搞混淆。其实它们之间是有联系的:Where does the name come from? 而且Jupyter Logo的整体形象是木星,旁边的3个小黑点,代表的是木星的3颗卫星。
jupyter_logo

Jupyter Kernels

我们在上面提到过内核(Kernel)的概念。Jupyter中的Kernel指的是计算引擎,它用来执行Notebook中包含的代码。早期的Jupyter支持Python、R和Julia,对应的Kernel分别为:

随着Jupyter的流行以及开源社区的努力,现在Jupyter已经支持绝大部分的主流编程语言了。这一点,我们从它主页的横幅图片也可以看出。
jupyter_circle_of_programming_languages

主流编程语言对应的Kernel如下表所示,完整的列表请看这里

NameJupyter/IPython VersionLanguage(s) Version3rd party dependenciesExample NotebooksNotes
IRubyruby >= 2.1
IJavascriptnodejs >= 0.10
ICSharpJupyter 4.0C# 4.0+scriptcs
IFSharpIPython 2.0F#Features
lgoJupyter >= 4, JupyterLabGo >= 1.8ZeroMQ (4.x)ExampleDocker image
IScalaScala
Jupyter-scalaIPython>=3.0Scala>=2.10example
IErlangIPython 2.3Erlangrebar
IPerlPerl 5
Perl6Jupyter >= 4Perl 6.czeromq 4
IPerl6Perl 6
Jupyter-PHPJupyter 4.0PHP >= 7.0.0composer, php-zmq
BashIPython >= 3bashWrapper
PowerShellIPython >= 3WindowsWrapper, Based on Bash Kernel
CJupyterCgcc
jupyter-nodejsJupyter, iPython 3.xNodeJS, Babel, ClojurescriptExamples
ITypeScriptTypescript >= 2.0Node.js >= 0.10.0
IJavaJupyterJava 9Java JDK >= 9Binder online demoBased on the new JShell tool

当你打开一个Jupyter notebook时,它所关联的Kernel就会启动,当用户选择Run All时,Kernel就会执行Notebook中所有的代码并返回计算结果。只有当用户显式的关闭Kernel时,Kernel才会被销毁,否则它会一直在后台运行。

一般来说,一个Notebook对应一个Kernel的进程,例如下图中有2个Python的Kernel进程。
jupyter_running_kernels

在Jupyter的发展过程中,如果要对众多Kernel的重要性排个序的话,IPython绝对是第一位的。IPython因此被成为Kernel Zero,并且它也是Jupyter安装的依赖项。Jupyter安装好之后,IPython这个Kernel也就装好了。我们知道Python语言有很多不同的实现,例如CPython、JPython、IronPython、PyPy等。千万不要把IPython和这些Python实现搞混淆了,本质上来说IPython是对CPython的一个包装,Notebook中的代码最终是靠CPython来解析和执行的。

使用Jupyter Notebook

你现在一定迫不及待的想要体验下Jupyter Notebook。在本地的机器上搭建一个Jupyter Notebook并不是那么容易的一件事情,但在云计算时代,我们有更好的选择 ——— 使用托管的Jupyter Notebook。

使用托管的Jupyter Notebook

mybinder.org

mybinder.org是Jupyter官方推荐的一个托管平台。Jupyter官方给出的几个Notebook的示例也是运行在mybinder.org提供的Notebook服务器上的。除此之外,mybinder.org还能加载Github代码库中的Notebook文件。

Azure Notebooks

Azure Notebooks是微软推出的Notebook托管平台,支持Python、R以及F#。相较于标准的Jupyter Notebook,Azure Notebooks预安装了很多包,使得它更适合于数据科学。

Azure Notebooks现在还是Preview状态,强烈推荐你去尝试下!
azure_notebooks

Google Colaboratory

Google Colaboratory是Google推出的Notebook托管平台,支持Python2及3,它和Github有很好的集成。

google_colaboratory

本地安装Jupyter Notebook

使用Anaconda

Jupyter官方推荐使用Anaconda来安装Jupyter Notebook。Anaconda实际上是一个软件发行版,它附带了conda、Python 和 150多个数据科学包及其依赖项,因此它的下载文件比较大(约500多MB)。应用程序conda是包和环境管理器。

在安装Visual Studio 2017时,可以选择数据科学与分析应用程序,这会自动安装Anaconda。
vs_installation_anaconda

使用pip

对于Python比较熟悉的同学,可以使用pip来安装Jupyter Notebook。
首先确保pip是最新的版本:

1
pip3 install --upgrade pip

然后使用如下的命令安装Jupyter Notebook:

1
pip3 install jupyter

如果你使用Python 2,请将pip3改成pip

启动Jupyter Notebook

Jupyter Notebook安装完成之后,打开Windows命令行或者Anaconda命令行,输入jupyter notebook即可,Jupyter Notebook默认会在8888端口下运行。

对于Jupyter Notebook的基本使用,我推荐这个视频教程:Jupyter Tips and Tricks

JupyterLab

JupyterLab是下一代Jupyter的Web界面。虽然它还没有正式发布,但是已经可以支撑日常的使用了。增强的UI和功能让JupyterLab看起来更像一个浏览器中的IDE。如果你已经对原来的Jupyter Notebook很了解了,我建议你从现在开始使用JupyterLab。
jupyterlab

Azure Notebooks也是支持JupyterLab的。

总结

本文叙述了Jupyter Notebook的一些基本概念、名称的由来以及如何安装。Jupyter Notebook的本质是编程语言的一种界面,它区别与常规程序以文件的形式解析或编译执行,取而代之是交互式的编程,提高了效率和响应速度。Jupyter Notebook以其方便的交互模式和丰富的Web视图呈现,在数据分析、数据可视化、机器学习等领域非常受欢迎,它已经成为了数据分析和人工智能领域事实上的标准工具。学习和掌握它,对你的人工智能之路一定是大有裨益的。

相关链接