《scikit-learn机器学习常用算法原理及编程实战》—2.2 IPython简介
2.2 IPython简介
IPython是公认的现代科学计算中最重要的Python工具之一。它是一个加强版的Python交互式命令行工具,与系统自带的Python交互环境相比,IPython具有以下明显的几个特点:
* 与Shell紧密关联,可以在IPython环境下直接执行Shell指令;
* 可以直接绘图操作的Web GUI环境,在机器学习领域、探索数据模式、可视化数据、绘制学习曲线时,这一功能特别有用;
* 更强大的交互功能,包括内省、Tab键自动完成、魔术命令等。
2.2.1 IPython基础
如果你之前没有接触过IPython,那么现在是打开计算机体验IPython的绝好时机,这种提高工作效率类的软件,单单看书是完全无法体验它的威力和便利性的。
正确安装IPython后,在命令行输入ipython即可启动IPython交互环境。
$ ipython
Python 2.7.10 (default, Jul 30 2016, 19:40:32)
Type "copyright", "credits" or "license" for more information.
IPython 5.3.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]:
基本上,可以像使用Python交互环境一样使用IPython交互环境:
In [1]: a = 5
In [2]: a + 3
Out[2]: 8
跟Python交互环境相比,IPython的输出排版更简洁、优美:
In [3]: import numpy as np
In [4]: data = {i: np.random.randn() for i in range(8)}
In [5]: data
Out[5]:
{0: -0.12696712293771154,
1: -0.9291628055121173,
2: 0.8248356377337012,
3: -0.5381098900612056,
4: 2.0246437691867816,
5: -2.089016766007329,
6: 1.234086243284236,
7: 0.39953080301369065}
对比一下标准的Python交互环境下的输出:
>>> import numpy as np
>>> data = {i: np.random.randn() for i in range(8)}
>>> data
{0: -0.7989884322559587, 1: 0.2275777042011071, 2: 0.012864065192735426,
3: -1.3183480226587958, 4: -0.9149466170543599, 5: -0.683377363404726, 6:
-0.8964451905483575, 7: -0.37082447512220285}
>>>
很多时候,并不是我们不懂审美,而是没有机会发现美。此外,IPython的Tab键自动补全功能是提高效率的秘籍。例如,输入np.random.rand命令后,按Tab键,会自动显示np.random命名空间下以rand开头的所有函数。这一功能的便利性赶上了主流IDE。
In [6]: np.random.rand<TAB>
np.random.rand np.random.random
np.random.randint np.random.random_integers
np.random.randn np.random.random_sample
记住一些快捷键,可以让你在IPython环境***验健步如飞的感觉。对于熟悉Shell命令的读者,这些命令会有似曾相识的感觉。
* Ctrl+A:移动光标到本行的开头;
* Ctrl+E:移动光标到本行的结尾;
* Ctrl+U:删除光标所在位置之前的所有字符;
* Ctrl+K:删除光标所在位置之后的所有字符,包含当前光标所在的字符;
* Ctrl+L:清除当前屏幕上显示的内容;
* Ctrl+P:以当前输入的字符作为命令的起始字符,在历史记录里向后搜索匹配的命令;
* Ctrl+N:以当前输入的字符作为命令的起始字符,在历史记录里向前搜索匹配的命令;
* Ctrl+C:中断当前脚本的执行。
另外,IPython提供了强大的内省功能。在Python交互环境里,只能使用help()函数来查阅内置文档,在IPython环境里可以直接在类或变量后面加上一个问号“?”来查阅文档:
In [7]: np.random.randn?
Docstring:
randn(d0, d1, ..., dn)
Return a sample (or samples) from the "standard normal" distribution.
... ...
在类或变量或函数后面加两个问号“??”还可以直接查看源代码。结合星号“*”和问号“?”,还可以查询命名空间里的所有函数和对象。例如,查询np.random下面以rand开头的所有函数和对象:
In [12]: np.random.rand*?
np.random.rand
np.random.randint
np.random.randn
np.random.random
np.random.random_integers
np.random.random_sample
从这些特性可以看出来,IPython鼓励探索性编程。即当你对环境还不熟悉的时候,允许通过简便快捷的方式来找到你想找的信息。
除此之外,IPython还提供了强大的魔术命令。例如,我们在当前工作目录下有一个叫hello.py的文件,其内容为:
msg = 'hello ipython'
print(msg)
然后在IPython里输入%run hello.py命令即可直接运行这个python文件。这个文件是在一个空的命名空间里运行的,并且运行之后,该文件里定义的全局变量和函数就会自动引用到当前IPython空间中。
In [13]: %run hello.py
hello ipython
In [14]: msg
Out[14]: 'hello ipython'
还有一个常用的魔术命令是%timeit,可以用来快速评估代码的执行效率。例如,下面的代码用来评估一个100 ? 100的矩阵点乘所需要运行的时间。
In [15]: a = np.random.randn(100, 100)
In [16]: %timeit np.dot(a, a)
1 loops, best of 3: 261 us per loop
还可以使用%who或%whos命令来查看当前环境下的变量列表。
In [17]: %who
a msg np
In [18]: %whos
Variable Type Data/Info
-------------------------------
a ndarray 100x100: 10000 elems, type `float64`, 80000 bytes
msg str hello ipython
np module <module 'numpy' from 'C:\<...>ages\numpy\__init__.pyc'>
还有一些比较常用的魔术命令如下。
* %quickref:显示IPython的快速参考文档;
* %magic:显示所有的魔术命令及其详细文档;
* %reset:删除当前环境下的所有变量和导入的模块;
* %logstart:开始记录IPython里的所有输入的命令,默认保存在当前工作目录的 ipython_log.py中;
* %logstop:停止记录,并关闭log文件。
需要说明的是,在魔术命令后面加上问号“?”可以直接显示魔术命令的文档。我们来查看%reset魔术命令的文档。
In [28]: %reset?
Docstring:
Resets the namespace by removing all names defined by the user, if
called without arguments, or by removing some types of objects, such
as everything currently in IPython's In[] and Out[] containers (see
the parameters for details).
IPython与shell交互的能力,可以让我们不离开IPython环境即可完成很多与操作系统相关的功能,特别是在Linux/Mac OSX系统下工作时。最简单的方式,就是在命令前加上感叹号“!”即可直接运行shell命令(Windows系统下运行cmd命令)。比如下面的命令可以很方便地在IPython交互环境下打印出网络地址:
In [36]: !ifconfig | grep "inet "
inet 127.0.0.1 netmask 0xff000000
inet 192.168.1.103 netmask 0xffffff00 broadcast 192.168.1.255
以感叹号为前缀的shell命令是和操作系统相关的,Windows系统和Linux/Mac OSX系统相差很大。当使用%automagic on启用自动魔术命令功能后,可以省略百分号“%”的输入即可直接运行魔术命令:
In [68]: %automagic on
Automagic is ON, % prefix IS NOT needed for line magics.
In [69]: pwd
Out[69]: u'/Users/kamidox'
In [70]: ls
Applications/ Pictures/ lab/
Desktop/ Public/ osx/
Documents/ android/ scikit_learn_data/
Downloads/ bin/ tools/
In [71]: cd lab
/Users/kamidox/lab
In [72]: pwd
Out[72]: u'/Users/kamidox/lab'
我们经常会用import命令导入自己写的python模块,在调试过程中,修改了这个模块后,如果想让当前的修改马上起作用,必须使用reload()函数重新载入该模块。假设当前工作目录下有一个名字为hello.py的文件,其内容为:
def say_hello():
print('hello ipython')
导入模块,并运行say_hello()函数:
In [84]: import hello
In [85]: hello.say_hello()
hello ipython
把hello.py文件内容改为下面的内容并保存:
def say_hello():
print('ipython is a great tool')
此时,如果直接调用say_hello()函数,得到的依然是旧的输出,只有调用reload()函数重新载入模块,才能得到最新的输出:
In [86]: hello.say_hello()
hello ipython
In [87]: reload(hello)
Out[87]: <module 'hello' from 'hello.py'>
In [88]: hello.say_hello()
ipython is a great tool
- 点赞
- 收藏
- 关注作者
评论(0)