關於 IPython 的簡介

MirrorTan發表於2019-08-25

IPython 是 Python shell 的增強版,它鼓勵一種「執行-探索」式(execute explore) 的工作模式,而不是其他許多語言那種「編輯-編譯-執行」(edit-compile-run) 的傳統工作模式。而且,它與作業系統 shell 和檔案系統之間也有非常緊密的整合,因此,在資料分析工作中得到廣泛應用。

IPython 官網為 https://ipython.org/.

1 基礎操作

IPython 可通過 pip 進行直接安裝 pip install ipython,使用命令列啟動 IPython 與啟動標準 Python 直譯器類似:

$ ipython
Python 3.7.4 (default, Jul  9 2019, 18:13:23)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.7.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from datetime import d<Tab>
                               date          dbm
                               datetime      dim
                               datetime_CAPI

相較於 Python 標準直譯器,IPython 提供的一些額外功能包括:

  • 使用 Tab 實現自動補全功能。
  • 使用問號 ? 呈現物件的說明。
  • 提供了一系列以 % 開頭的魔術命令為常見任務的執行提供便利。
  • 提供了額外的繪圖功能。
  • 可使用作業系統中的命令。

在 IPython 環境中,我們可以直接使用 %quickref 檢視 IPython 的參考手冊,也可以使用 %magic 來檢視 IPython 中魔術命令的資訊,以更好的使用 IPython 工具。

In [1]: %quickref
IPython -- An enhanced Interactive Python - Quick Reference Card
================================================================

obj?, obj??      : Get help, or more help for object (also works as
                   ?obj, ??obj).
?foo.*abc*       : List names in 'foo' containing 'abc' in them.
%magic           : Information about IPython's 'magic' % functions.

Magic functions are prefixed by % or %%, and typically take their arguments
without parentheses, quotes or even commas for convenience.  Line magics take a
single % and cell magics are prefixed with two %%.

Example magic function calls:
:

Tips: IPython 可進行一些自定義的配置,該配置檔案位於 ~/.ipython~/.config/.ipython 目錄(Unix)和 %HOME%/.ipython 目錄(Windows)中。

2 命令歷史

IPython 與 Python 直譯器一樣,採用「逐行輸入程式碼」並「立即執行」的方式,它們均可用Ctrl + P 或 ↑ 查詢執行過的命令、使用 Ctrl + N 或 ↓查詢(當前查詢位置)命令後執行的命令。

此外,IPython 提供了更強的輸入輸出變數管理以及記錄功能:

最近兩次執行的結果 (Out) 分別儲存在 ___ 變數中。而且,IPython 還採用 _iN, _N 的方式將所有輸入及輸出的歷史記錄進行儲存 ~ 其中 N 為行號:

In [1]: 2 + 4 / 1.2
Out[1]: 5.333333333333334

In [2]: _
Out[2]: 5.333333333333334

In [3]: 3 ** 5
Out[3]: 243

In [4]: 1 + 7*9
Out[4]: 64

In [5]: __
Out[5]: 243

In [6]: _i3
Out[6]: '3 ** 5'

In [7]: _3
Out[7]: 243

同時,因在 _iN 中儲存的輸入歷史為字串,使用 eval(_iN) 即可重新執行指定行中的程式碼:

In [8]: eval(_i4) # eval('1 + 7*9')
Out[8]: 64

對於在 IPython 中執行過的命令,可通過 %logstart 將之儲存在 Python 檔案中:

In [9]: %logstart
Activating auto-logging. Current session state plus future input saved.
Filename       : ipython_log.py
Mode           : rotate
Output logging : False
Raw input log  : False
Timestamping   : False
State          : active

該魔術命令會將截止目前輸入的命令儲存在當前資料夾下的 ipython_log.py 檔案中,並將後續執行的命令也會新增進去。當前 ipython_log.py 檔案中的內容為:

# IPython log file

2 + 4 / 1.2
_
3 ** 5
1 + 7*9
__
_i3
_3
eval(_i4)
get_ipython().run_line_magic('logstart', '')

3 與作業系統互動

IPython 中可執行系統中的命令,以 ! 開頭的命令列後的內容需要在系統 shell 中執行,並且可將執行的結果存放在變數中:

In [22]: !ls
IPython.md                      data_science.md                 pandas.ipynb
Jupyter.ipynb                   README.md

In [23]: markdown_file = '*.md'

In [24]: !ls $markdown_file
IPython.md      README.md       data_science.md

In [25]: markdown = !ls $markdown_file

In [26]: markdown
Out[26]: ['IPython.md', 'README.md', 'data_science.md']

如上例所示,IPython 中執行 ! 開始的系統命令時,還可以執行使用當前環境中的變數 ~ 以 $ 開頭。

Tips: 我們同樣可以使用「魔術命令」 %alias 為 shell 命令自定義簡稱 ~ 僅對當前 IPython 會話有效。要永久有效,可在配置檔案中進行設定;也可使用 %bookmark 命令來設定常用目錄的簡寫。

4 分析工具

IPython 同樣提供了一些程式碼分析工具,如程式碼執行時間的分析工具 %time%timeit、基本的效能分析 %prun%run -p 等。

在 Python 程式碼中,我們可以藉助於 time 模組來測算程式碼執行的時間:

import time

start = time.time()

# do somthing

duration = time.time() - start

而 IPython 中提供了 %time%timeit 兩個魔術命令用於簡化測算程式碼執行時間工作:

  • %time:整體執行一次,給出執行時間;
  • %timeit:多次執行,給出平均時間。
In [42]: %time 'foobar'.startswith('foo')
CPU times: user 3 µs, sys: 0 ns, total: 3 µs
Wall time: 5.96 µs
Out[42]: True

In [43]: %time 'foobar'[:3] == 'foo'
CPU times: user 2 µs, sys: 1 µs, total: 3 µs
Wall time: 5.01 µs
Out[43]: True

In [44]: %timeit 'foobar'.startswith('foo')
137 ns ± 0.29 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [45]: %timeit 'foobar'[:3] == 'foo'
119 ns ± 0.33 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

使用 %time 執行一次給出執行時間可能會導致一定的偏差;%timeit 以多次執行給出平均時間方式更加精準。

此外,%run -p 命令為 Python 的效能分析工具 cProfile 模組提供了一個 IPython 的介面,在執行一個程式或程式碼塊時,可記錄各函式所耗費的時間。

%debug 命令則可呼叫 IPython 中增強版的 pdb 對上一句執行的命令進行除錯。

5 參考資料

  1. McKinney, Wes. Python for data analysis: Data wrangling with Pandas, NumPy, and IPython. " O'Reilly Media, Inc.", 2012.
  2. IPython Docs, https://ipython.readthedocs.io/en/stable/i..., 2019/08/25.

相關文章