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 的一大特色,它为用户提供了非常强大的功能,可以帮助你提高工作效率。
-
查看魔法命令列表: 在 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.
-
常用魔法命令:
%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
注意相对路径和绝对路径。另外,路径可以用
path = r'XXXXXX'
,当你在字符串前加上r
或R
,Python 会将字符串中的反斜杠\
视为普通字符,而不是转义字符。(因为有时候\t表示制表符,无法表示为路径)当我们使用魔法命令执行了一个外部文件时,该文件的函数就能在当前会话中使用。比如:
==2.%time
和 %timeit
:测量代码的运行时间==
基于上面的mySquare
函数,可以测试一下这两个魔法命令。
1
%time mySquare(10)
当在 IPython 中运行
%time
命令来测量代码执行时间时,IPython 会返回一组信息,其中包括几个不同的时间指标:CPU times
和Wall 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)])
可以使用两个百分号来测试多行代码的平均运行时间:
1
2
3
4
%%timeit
statement1
statement2
statement3
例如:
1
2
3
%%timeit
sum([i for i in range(6)])
mySquare(90)
用%time
还是%timeit
?
当你需要测量一个代码块的 单次执行时间,并且这个代码块的【执行时间较长】,或者你只关心一次执行的时间时,使用 %time
。
当你需要对代码块进行 多次重复测试,并希望获得该代码的 平均执行时间 时,使用 %timeit
。它适用于快速执行且【执行时间较短】的代码。
==3.%history
==
==4.%%writefile
:将当前单元格的内容写入到一个文件中==
%%writefile
命令需要放在代码单元格的第一行,并指定想写入的文件路径。它会将整个单元格中的内容写入指定的文件。
格式:
1
2
%%writefile <filename>
<代码或文本>
例如:
1
2
3
4
5
%%writefile my_test.py
def sayHappy():
return "Happy new year!!"
sayHappy()
写入成功:
也可以将普通文本或配置文件写入文件。例如,创建一个简单的文本文件:
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.
注意:
1.如果指定的文件已经存在,
%%writefile
会覆盖文件的内容。如果你不想覆盖现有文件,可以使用%%appendfile
来追加内容。2.提供相对路径或绝对路径来指定文件的位置。如果只是写文件名,它将会写在当前工作目录下。如果希望写入其他目录,可以指定完整路径。
3.每次运行
%%writefile
,它会将当前单元格中的所有内容写入文件,因此通常不用于频繁写入同一文件。
==5.%matplotlib inline
:在 Jupyter Notebook 中直接显示图像。==
%matplotlib inline
是 IPython 和 Jupyter Notebook 中的一个魔法命令,专门用于 嵌入 Matplotlib 图形,使得图表可以直接在 Notebook 中显示,而不是弹出一个独立的图形窗口。这个命令是非常常用的,尤其是在进行数据可视化时。
为了测试这个命令,首先需要安装matplotlib
:
查看安装的版本:
1
2
import matplotlib as plt
plt.__version__
在 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() 来显示图形
==6.%load
:将外部 Python 文件加载到当前会话中。==
从外部文件或 URL 中加载 Python 代码并将其插入到当前单元格中。这个命令非常有用,特别是当你想在 Notebook 中快速加载和执行一些已有的代码时。
例如运行%load script_test.py
,单元格就变成了:
也可以使用 URL 来加载 Python 代码:
1
%load https://raw.githubusercontent.com/username/repository/branch/path/to/script.py
注意:
1.使用
%load
仅将代码插入单元格,不会自动执行。如果你希望执行代码,插入后还需要手动执行该单元格。2.如果当前单元格中已经有内容,使用
%load
会 覆盖这些内容。所以请小心使用。3.
%load
只会加载 Python 代码,不会加载其他文件类型(如文本或二进制文件)。如果你希望加载其他格式的文件,可以手动读取文件内容并处理。
==7.%who
,%whos
和who_ls
==
%who
:显示当前环境中所有已定义的变量(包括常规变量、函数、类等)。它不显示变量的值,只显示变量的名称。%whos
:提供了 更多的详细信息,例如每个变量的类型、大小和内容。%who_ls
:返回一个包含当前环境中所有变量名称的 字符串列表.
2 IPython 高级功能
集成 Shell 命令:可以在 IPython 中直接运行 Shell 命令。例如,使用 !ls
查看当前目录,使用 !pip install
安装包。
调试和错误处理:IPython 提供了更清晰的错误报告,并支持内建的 pdb
调试工具。可以通过 %debug
调用调试器。
如果代码发生了异常,可以在错误发生之后使用
%debug
进行调试。例如:
运行上面的代码时,会抛出一个
ZeroDivisionError
异常。接着,输入
%debug
,就会启动调试器,并显示出错时的堆栈信息:
进入调试器后,会看到类似于上面的交互式调试界面,提示当前的调用堆栈:
ipdb
(IPython 调试器)是 IPython 中的内置调试器,它是 Python 的标准调试器pdb
的一个扩展。可以在ipdb>
提示符下执行一些调试命令。常见调试命令
在调试模式下,可以使用以下命令来检查当前状态和控制调试过程:
n
(next):执行当前行,并停在下一行代码上(逐行执行)。s
(step):进入函数内部,逐步调试。c
(continue):继续执行,直到下一个断点或程序结束。q
(quit):退出调试器,终止当前会话。p <variable>
:打印指定变量的值。例如,p a
会显示a
变量的当前值。l
(list):显示当前执行位置附近的代码行。h
(help):显示调试器命令的帮助信息。
支持可视化输出:IPython 可以与 Matplotlib 等库无缝集成,在会话中直接显示图像、图表和 LaTeX 数学公式等内容。
并行计算:如果对并行计算感兴趣,IPython 还支持通过其 ipyparallel
模块进行多进程或分布式计算。
IPython 官方文档非常详细,涵盖了从基础到高级的各种用法。你可以在 IPython 会话中使用 %quickref
查看快速参考,或者访问官方文档网站。