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的比例反而不是那么高。
Jupyter Notebook的一个重要目的是计算的可重复性(reproducible
)。对于数据科学家和学生来说,论文中实验的可重复性是至关重要的,这也是为什么他们才是Jupyter Notebook的主力用户。
Jupyter Notebook是如何工作的
Jupyter Notebook源自Fernando Perez发起的IPython项目。IPython 是一种交互式的shell,与普通的Python shell相似,但具有一些很好的功能(如语法高亮和代码补全)。Notebook的工作方式是将来自Web应用的消息发送给IPython内核(服务器后台运行的IPython应用程序)。内核执行代码,然后将结果返回给Notebook。整个架构如下图所示。
我在这篇博客中讲述了支持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 Kernels
我们在上面提到过内核(Kernel
)的概念。Jupyter中的Kernel指的是计算引擎,它用来执行Notebook中包含的代码。早期的Jupyter支持Python、R和Julia,对应的Kernel分别为:
随着Jupyter的流行以及开源社区的努力,现在Jupyter已经支持绝大部分的主流编程语言了。这一点,我们从它主页的横幅图片也可以看出。
主流编程语言对应的Kernel如下表所示,完整的列表请看这里。
Name | Jupyter/IPython Version | Language(s) Version | 3rd party dependencies | Example Notebooks | Notes |
---|---|---|---|---|---|
IRuby | ruby >= 2.1 | ||||
IJavascript | nodejs >= 0.10 | ||||
ICSharp | Jupyter 4.0 | C# 4.0+ | scriptcs | ||
IFSharp | IPython 2.0 | F# | Features | ||
lgo | Jupyter >= 4, JupyterLab | Go >= 1.8 | ZeroMQ (4.x) | Example | Docker image |
IScala | Scala | ||||
Jupyter-scala | IPython>=3.0 | Scala>=2.10 | example | ||
IErlang | IPython 2.3 | Erlang | rebar | ||
IPerl | Perl 5 | ||||
Perl6 | Jupyter >= 4 | Perl 6.c | zeromq 4 | ||
IPerl6 | Perl 6 | ||||
Jupyter-PHP | Jupyter 4.0 | PHP >= 7.0.0 | composer, php-zmq | ||
Bash | IPython >= 3 | bash | Wrapper | ||
PowerShell | IPython >= 3 | Windows | Wrapper, Based on Bash Kernel | ||
C | Jupyter | C | gcc | ||
jupyter-nodejs | Jupyter, iPython 3.x | NodeJS, Babel, Clojurescript | Examples | ||
ITypeScript | Typescript >= 2.0 | Node.js >= 0.10.0 | |||
IJava | Jupyter | Java 9 | Java JDK >= 9 | Binder online demo | Based on the new JShell tool |
当你打开一个Jupyter notebook时,它所关联的Kernel就会启动,当用户选择Run All
时,Kernel就会执行Notebook中所有的代码并返回计算结果。只有当用户显式的关闭Kernel时,Kernel才会被销毁,否则它会一直在后台运行。
一般来说,一个Notebook对应一个Kernel的进程,例如下图中有2个Python的Kernel进程。
在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状态,强烈推荐你去尝试下!
Google Colaboratory
Google Colaboratory是Google推出的Notebook托管平台,支持Python2及3,它和Github有很好的集成。
本地安装Jupyter Notebook
使用Anaconda
Jupyter官方推荐使用Anaconda来安装Jupyter Notebook。Anaconda实际上是一个软件发行版,它附带了conda
、Python 和 150多个数据科学包及其依赖项,因此它的下载文件比较大(约500多MB)。应用程序conda是包和环境管理器。
在安装Visual Studio 2017时,可以选择
数据科学与分析应用程序
,这会自动安装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。
Azure Notebooks也是支持JupyterLab的。
总结
本文叙述了Jupyter Notebook的一些基本概念、名称的由来以及如何安装。Jupyter Notebook的本质是编程语言的一种界面,它区别与常规程序以文件的形式解析或编译执行,取而代之是交互式的编程,提高了效率和响应速度。Jupyter Notebook以其方便的交互模式和丰富的Web视图呈现,在数据分析、数据可视化、机器学习等领域非常受欢迎,它已经成为了数据分析和人工智能领域事实上的标准工具。学习和掌握它,对你的人工智能之路一定是大有裨益的。