IPython学习笔记

IPython学习-魔法命令、高级功能

Posted by Hilda on January 27, 2025

IPython 是一个增强版的 Python 交互式解释器,最初由 Fernando Pérez 在 2001 年开发。它提供了比标准 Python 解释器(即 REPL,Read-Eval-Print Loop)更强大和灵活的功能,尤其适合数据分析和科学计算领域。IPython 现在已经发展成了 Jupyter 项目的一部分,支持多种语言,并提供了 Web 环境、可视化支持等多种功能。

Fernando Pérez 是一位著名的计算机科学家和数据科学家,最著名的成就是他创建了 IPython 项目,并且是 Jupyter 项目的共同创始人之一。

Fernando Pérez 不仅是 IPython 和 Jupyter 的核心开发者,还积极参与开源软件社区。他倡导在科研和学术领域中采用开源软件工具,以提高科研效率和透明度。

Fernando Pérez 拥有美国加利福尼亚大学伯克利分校(UC Berkeley)的物理学博士学位。

学习前启动jupyter环境:

1
2
workon env1
jupyter notebook

1 IPython 的魔法命令

魔法命令是 IPython 的一大特色,它为用户提供了非常强大的功能,可以帮助你提高工作效率。

  1. 查看魔法命令列表: 在 IPython 中输入 %lsmagic,就能看到所有的魔法命令。

    1
    
    %lsmagic
    
    1
    2
    3
    4
    5
    6
    7
    
    Available line magics:
    %alias  %alias_magic  %autoawait  %autocall  %automagic  %autosave  %bookmark  %cat  %cd  %clear  %code_wrap  %colors  %conda  %config  %connect_info  %cp  %debug  %dhist  %dirs  %doctest_mode  %ed  %edit  %env  %gui  %hist  %history  %killbgscripts  %ldir  %less  %lf  %lk  %ll  %load  %load_ext  %loadpy  %logoff  %logon  %logstart  %logstate  %logstop  %ls  %lsmagic  %lx  %macro  %magic  %mamba  %man  %matplotlib  %micromamba  %mkdir  %more  %mv  %notebook  %page  %pastebin  %pdb  %pdef  %pdoc  %pfile  %pinfo  %pinfo2  %pip  %popd  %pprint  %precision  %prun  %psearch  %psource  %pushd  %pwd  %pycat  %pylab  %qtconsole  %quickref  %recall  %rehashx  %reload_ext  %rep  %rerun  %reset  %reset_selective  %rm  %rmdir  %run  %save  %sc  %set_env  %store  %sx  %system  %tb  %time  %timeit  %unalias  %unload_ext  %who  %who_ls  %whos  %xdel  %xmode
    
    Available cell magics:
    %%!  %%HTML  %%SVG  %%bash  %%capture  %%code_wrap  %%debug  %%file  %%html  %%javascript  %%js  %%latex  %%markdown  %%perl  %%prun  %%pypy  %%python  %%python2  %%python3  %%ruby  %%script  %%sh  %%svg  %%sx  %%system  %%time  %%timeit  %%writefile
    
    Automagic is ON, % prefix IS NOT needed for line magics.
    
  2. 常用魔法命令

    • %time%timeit:用来测量代码的运行时间。
    • %run:运行 Python 脚本。
    • %history:查看命令历史。
    • %%writefile:将代码写入文件。
    • %matplotlib inline:在 Jupyter Notebook 中直接显示图像。
    • %load:将外部 Python 文件加载到当前会话中。

==1.%run==

同目录下有script_test.py,内容如下:

1
2
3
4
5
def mySquare(x):
    return x**2

for i in range(1,6):
    print(i,'squared is',mySquare(i))

在Jupyter 中,运行命令是%run script_test.py

image-20250127205054624

注意相对路径和绝对路径。另外,路径可以用path = r'XXXXXX',当你在字符串前加上 rR,Python 会将字符串中的反斜杠 \ 视为普通字符,而不是转义字符。(因为有时候\t表示制表符,无法表示为路径)

当我们使用魔法命令执行了一个外部文件时,该文件的函数就能在当前会话中使用。比如:

image-20250127205222701

==2.%time%timeit:测量代码的运行时间==

基于上面的mySquare函数,可以测试一下这两个魔法命令。

1
%time mySquare(10)

image-20250127205404416

当在 IPython 中运行 %time 命令来测量代码执行时间时,IPython 会返回一组信息,其中包括几个不同的时间指标:CPU timesWall time

CPU times(CPU 时间)

这个值表示 CPU 花费的时间,它分为三个部分:

  • user:表示在用户空间(即你写的代码)上花费的时间,单位是微秒(µs)或纳秒(ns)。也就是说,这部分时间是 CPU 在执行 Python 代码时花费的时间。
  • sys:表示在操作系统内核空间(即操作系统的系统调用)上花费的时间,通常包括 I/O 操作、文件系统操作等。这个时间通常比较少,因为很多 Python 操作是在用户空间完成的。

另外一个是 total,是两者之和。

Wall time(墙钟时间)

这个值表示 总的真实时间,即从代码开始执行到执行完毕的实际时间。墙钟时间是我们通常感觉到的时间,考虑了系统的所有延迟和开销。

  • Wall time 包括了 CPU 时间以及其他系统等待、I/O 操作、上下文切换等因素。比如,如果代码在等待磁盘 I/O 或网络响应时,墙钟时间会比 CPU 时间更长。

  • CPU times 关注的是 CPU 花费的时间,主要指执行代码时的【计算时间】。

  • Wall time 是更接近我们实际感觉到的时间,考虑了所有的系统延迟和开销,包括 I/O 操作等。

1
%timeit sum([i for i in range(6)])

image-20250127210230288

可以使用两个百分号来测试多行代码的平均运行时间:

1
2
3
4
%%timeit
statement1
statement2
statement3

例如:

1
2
3
%%timeit 
sum([i for i in range(6)])
mySquare(90)

image-20250127210403479


%time还是%timeit?

当你需要测量一个代码块的 单次执行时间,并且这个代码块的【执行时间较长】,或者你只关心一次执行的时间时,使用 %time

当你需要对代码块进行 多次重复测试,并希望获得该代码的 平均执行时间 时,使用 %timeit。它适用于快速执行且【执行时间较短】的代码。


==3.%history==

image-20250127210734952


==4.%%writefile:将当前单元格的内容写入到一个文件中==

%%writefile 命令需要放在代码单元格的第一行,并指定想写入的文件路径。它会将整个单元格中的内容写入指定的文件。

格式:

1
2
%%writefile <filename>
<代码或文本>

例如:

1
2
3
4
5
%%writefile my_test.py
def sayHappy():
    return "Happy new year!!"

sayHappy()

写入成功:

image-20250127211053837

image-20250127211106266

也可以将普通文本或配置文件写入文件。例如,创建一个简单的文本文件:

1
2
3
4
%%writefile my_text_file.txt
This is a simple text file.
It can contain multiple lines of text.
You can add more lines as needed.

image-20250127211150994

注意:

1.如果指定的文件已经存在,%%writefile 会覆盖文件的内容。如果你不想覆盖现有文件,可以使用 %%appendfile 来追加内容。

2.提供相对路径或绝对路径来指定文件的位置。如果只是写文件名,它将会写在当前工作目录下。如果希望写入其他目录,可以指定完整路径。

3.每次运行 %%writefile,它会将当前单元格中的所有内容写入文件,因此通常不用于频繁写入同一文件。


==5.%matplotlib inline:在 Jupyter Notebook 中直接显示图像。==

%matplotlib inline 是 IPython 和 Jupyter Notebook 中的一个魔法命令,专门用于 嵌入 Matplotlib 图形,使得图表可以直接在 Notebook 中显示,而不是弹出一个独立的图形窗口。这个命令是非常常用的,尤其是在进行数据可视化时。

为了测试这个命令,首先需要安装matplotlib:

image-20250127211607054

查看安装的版本:

1
2
import matplotlib as plt
plt.__version__

image-20250127211744918

在 Notebook 中使用 %matplotlib inline: 在代码单元格的开头添加 %matplotlib inline,这会告诉 Jupyter 将所有 Matplotlib 图形嵌入在输出单元格中,而不是弹出独立窗口。


例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 导入必要的库
import matplotlib.pyplot as plt
import numpy as np

# 使用 %matplotlib inline 来确保图形嵌入到输出区域
%matplotlib inline

# 创建一些数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 绘制图形
plt.plot(x, y)
plt.title("Sine Wave")
plt.xlabel("x")
plt.ylabel("sin(x)")
plt.show()  # 使用 plt.show() 来显示图形

image-20250127211940386


==6.%load:将外部 Python 文件加载到当前会话中。==

从外部文件或 URL 中加载 Python 代码并将其插入到当前单元格中。这个命令非常有用,特别是当你想在 Notebook 中快速加载和执行一些已有的代码时。

例如运行%load script_test.py,单元格就变成了:

image-20250127212251655

也可以使用 URL 来加载 Python 代码:

1
%load https://raw.githubusercontent.com/username/repository/branch/path/to/script.py

注意:

1.使用 %load 仅将代码插入单元格,不会自动执行。如果你希望执行代码,插入后还需要手动执行该单元格。

2.如果当前单元格中已经有内容,使用 %load覆盖这些内容。所以请小心使用。

3.%load 只会加载 Python 代码,不会加载其他文件类型(如文本或二进制文件)。如果你希望加载其他格式的文件,可以手动读取文件内容并处理。


==7.%who,%whoswho_ls==

  • %who:显示当前环境中所有已定义的变量(包括常规变量、函数、类等)。它不显示变量的值,只显示变量的名称。
  • %whos:提供了 更多的详细信息,例如每个变量的类型、大小和内容。
  • %who_ls:返回一个包含当前环境中所有变量名称的 字符串列表.

image-20250127212704218

image-20250127212720588

image-20250127212736592

2 IPython 高级功能

集成 Shell 命令:可以在 IPython 中直接运行 Shell 命令。例如,使用 !ls 查看当前目录,使用 !pip install 安装包。

image-20250127213001798

调试和错误处理:IPython 提供了更清晰的错误报告,并支持内建的 pdb 调试工具。可以通过 %debug 调用调试器。

如果代码发生了异常,可以在错误发生之后使用 %debug 进行调试。

例如:

image-20250127213116023

运行上面的代码时,会抛出一个 ZeroDivisionError 异常。

接着,输入 %debug,就会启动调试器,并显示出错时的堆栈信息:

image-20250127213200000

进入调试器后,会看到类似于上面的交互式调试界面,提示当前的调用堆栈:

ipdb(IPython 调试器)是 IPython 中的内置调试器,它是 Python 的标准调试器 pdb 的一个扩展。可以在 ipdb> 提示符下执行一些调试命令。

常见调试命令

在调试模式下,可以使用以下命令来检查当前状态和控制调试过程:

  • n(next):执行当前行,并停在下一行代码上(逐行执行)。
  • s(step):进入函数内部,逐步调试。
  • c(continue):继续执行,直到下一个断点或程序结束。
  • q(quit):退出调试器,终止当前会话。
  • p <variable>:打印指定变量的值。例如,p a 会显示 a 变量的当前值。
  • l(list):显示当前执行位置附近的代码行。
  • h(help):显示调试器命令的帮助信息。

image-20250127213931749

支持可视化输出:IPython 可以与 Matplotlib 等库无缝集成,在会话中直接显示图像、图表和 LaTeX 数学公式等内容。

并行计算:如果对并行计算感兴趣,IPython 还支持通过其 ipyparallel 模块进行多进程或分布式计算。


IPython 官方文档非常详细,涵盖了从基础到高级的各种用法。你可以在 IPython 会话中使用 %quickref 查看快速参考,或者访问官方文档网站。