听说你会魔法?
本文作者:李钊颖
文字编辑:钱梦璇
导读
Jupyter Notebook是功能强大的交互式IDE,可以用于程序设计课程的教授、作为报告的工具等,在综合使用文字、代码、图片等多种元素展示设计者的想法方面有着美妙的用户体验。之前公众号发表的推文《Jupyter Notebook的使用》已经初步介绍其基本功能,以及《Jupyter Notebook不为人知的秘密》介绍了Nbextensions这个扩展插件。今天的推文里我们介绍下其自带的魔法命令(magic commands),这些命令可以更方便地扩展Jupyter Notebook的功能。
魔法命令主要包括两大类,第一类是行魔法(line magic),基本形式是 “%magic”, 表示magic只在本行有效;第二类是单元魔法(cell magic),基本形式是“%%magic”, 表示magic在整个cell单元有效。有些命令默认可以不带百分号使用,只要确定没有定义与其同名的变量即可,可以通过%automagic命令打开或者关闭此功能。魔法命令有很多种,这里我们挑一些常用命令进行讲解。
打印当前可用的魔法命令
魔法命令总共有多少种呢?我们可以用这个命令来查看当前可用的魔法命令。如果只能记住一个魔法命令,那必须是记这个。或者当你想用某个魔法命令,但又不知道怎么拼写时,就可以用%lsmagic命令查询:
%lsmagic #列出所有可用的魔法命令
获取帮助
在魔法命令后面加上“?”可以查询该命令的详细说明信息。例如:
计时命令
这些指令可以测试代码性能:%time、%timeit、%%time、%%timeit
(1)%time命令可以测量执行一行代码花费的时间:
strings = ['lii', 'liiben', 'ben', 'sam', 'python', 'stata and python'] * 100000 #定义一个复杂字符
%time method1 = [x for x in strings if x.startswith('lii')]
%time method2 = [x for x in strings if x[:3] == 'lii']
所以,看上去第一个方法耗费了将近两倍的时间,但这个结果并不精确。如果我们对相同语句多次执行%time命令的话,会发现结果是会改变的。为了得到更为精确的结果,我们可以使用魔术命令:%timeit,其多次执行一条语句,并返回平均时间。在默认情况下,它会将代码执行100000次,然后给出运行最快3次的平均值:
%timeit [x for x in strings if x.startswith('lii')]
%timeit [x for x in strings if x[:3] == 'lii']
(2)与上面两个命令不同,%%time命令是给出当前cell的代码运行一次所花费的时间:
%%time
L = []
for i in range(1000):
L.append(i * 2)
需要注意的是%%time命令后面不能有注释,有注释时运行会报错。而且同样的代码运行第二次是不会真正运行的,二次运行的时间是0,大家可以试一下。
%%timeit命令多次执行多条语句,并返回平均时间:
%%timeit
L = []
for i in range(1000):
L.append(i * 2)
执行一个Python脚本
%run后面紧接着一个相对地址的“file_name.py”,表示运行一个.py文件,脚本一旦被加载进来,我们就可以在后面的程序中使用该脚本文件中的逻辑定义。利用这个magic,我们可以把一些公共函数、基本设置写在不同的notebook内,需要的时候使用%run直接运行一下,就可以把公共函数和环境配置好了。这样可以将代码写成不同的模块,而不是全部写进一个notebook。在程序量大的时候可以节省空间和时间。
脚本test里面是画图的一段程序,这里使用%run成功运行了:
绘图有关的魔术命令
%matplotlib的具体作用是当我们调用matplotlib.pyplot的绘图函数plot()进行绘图的时候,可以直接在你的Python console里面生成图像。这个命令可确保Jupyter Notebook显示出我们的绘图。
%matplotlib inline:图像内嵌显示,也是默认形式。
%matplotlib auto:在这个模式下会弹出一个单独的绘图窗口。
%matplotlib notebook:在这个模式下会在notebook中产生一个绘图窗口,能够对图片进行放大缩小等操作。
首先看下不使用这个命令的输出结果:
import numpy as np
import matplotlib.pyplot as plt
plt.plot(np.arange(10))
运行这段程序之后Jupyter Notebook没有输出图像:
如果我们加上%matplotlib inline这个魔术命令,就可以直接输出图啦:
%matplotlib inline
plt.plot(np.arange(10))
如果使用%matplotlib notebook模式,将会产生一个绘图窗口,图画的大小也是可以改变的:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib notebook
plt.plot(np.arange(10))
查看当前环境中变量的类型、信息
%who、%who_ls、%whos这三个神奇的命令可以很好地向你展示环境中的变量列表。%who可以列出全局变量;%who_ls是以排序方式列出变量,还可以添加参数来定义要查看的变量类型,例如函数;%whos类似%who,但可以给出更详细的信息:
将单元格内容写到文件中
%%writefile在我们想要将notebook中写的复杂函数或者类保存到专门的文件中时非常有用,只需为函数或类的单元格添加%%writefile前缀,并写明想要保存到的文件名即可,当我们需要保存成.py文件的时候就不需要复制了。
我们可以将创建的函数保存到unit.py 文件中,只要保证与unit.py文件属于同一个目录即可,然后就可以任意导入了:
%%writefile unit.py
def triplesum(a,b,c):
d = a + b + c + a * b * c
return d
from unit import triplesum as tp
好用的魔法命令还有很多,限于篇幅我们这里只介绍了几种常用的命令。在后期使用过程中,有不清楚的地方都可以通过“%lsmagic+%magic?”这个无敌组合来获得命令的详细信息。魔术命令可以显著提升Jupyter Notebook的用户体验,大家赶快试一试吧!
线上Python课程都面向哪些方向?
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。