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 參考資料
- McKinney, Wes. Python for data analysis: Data wrangling with Pandas, NumPy, and IPython. " O'Reilly Media, Inc.", 2012.
- IPython Docs, https://ipython.readthedocs.io/en/stable/i..., 2019/08/25.