各位,早上好!今天我们来聊聊Jupyter Notebook里那些看起来像魔法的命令,它们以%
开头,能让你的代码生涯更加轻松愉快。咱们重点关注%run
、%timeit
和%matplotlib inline
这三位。准备好了吗? Let’s roll!
第一部分:%run
– 代码传送门
想象一下,你辛辛苦苦写了一个Python脚本,比如叫做my_script.py
,里面定义了一些函数、类或者干脆就是一大段逻辑。现在你想在Jupyter Notebook里调用它,怎么办?难道要复制粘贴过来吗?当然不用!%run
命令就是为此而生的。
1. 基本用法:一键执行
%run my_script.py
就这么简单。这条命令会执行my_script.py
里的所有代码,并将其中定义的变量、函数、类等等,都导入到当前的Jupyter Notebook环境中。这意味着,你可以在Notebook里直接使用my_script.py
里定义的任何东西,就像它们原本就在Notebook里一样。
2. 示例:
假设我们有一个my_script.py
文件,内容如下:
# my_script.py
def greet(name):
"""问候函数"""
print(f"Hello, {name}!")
my_variable = 42
然后在Jupyter Notebook里,我们执行:
%run my_script.py
greet("Alice") # 调用 my_script.py 里定义的函数
print(my_variable) # 访问 my_script.py 里定义的变量
输出将会是:
Hello, Alice!
42
3. 进阶用法:指定工作目录
有时候,你的my_script.py
文件可能依赖于其他文件,或者需要读取某些数据文件。这时,你需要确保my_script.py
在正确的目录下运行。%run
命令允许你指定工作目录:
%run -d path/to/directory my_script.py
-d path/to/directory
会将工作目录切换到 path/to/directory
,然后再执行 my_script.py
。
4. 实用技巧:调试脚本
%run
命令也可以用来调试脚本。如果你在 my_script.py
中设置了断点,并且使用 pdb
(Python Debugger),%run
会进入调试模式。
首先,在my_script.py
中加入断点:
# my_script.py
import pdb
def complicated_function(x, y):
pdb.set_trace() # 设置断点
result = x * y + x / y
return result
print(complicated_function(10, 2))
然后在Jupyter Notebook中执行:
%run my_script.py
Jupyter Notebook会暂停执行,并进入 pdb
调试模式。你可以使用 pdb
的命令(如 n
– next, p
– print, c
– continue 等)来逐步执行代码,查看变量的值,等等。
总结:%run
的优势
优点 | 描述 |
---|---|
代码复用性高 | 避免重复编写代码,直接调用现有脚本。 |
模块化开发 | 将代码拆分成多个文件,方便维护和管理。 |
脚本调试友好 | 可以方便地使用 pdb 调试脚本。 |
保持Notebook整洁 | 将复杂的逻辑放在单独的脚本中,保持Notebook的简洁性。 |
第二部分:%timeit
– 时间旅行者
你想知道你的代码运行有多快吗?%timeit
命令就是你的时间机器。它可以多次运行你的代码,并告诉你平均每次运行花费的时间。
1. 基本用法:精确计时
%timeit your_code_here
这条命令会多次运行 your_code_here
,并输出每次运行的时间。默认情况下,%timeit
会自动选择合适的运行次数,以获得足够精确的结果。
2. 示例:
import random
%timeit random.randint(1, 100) # 随机生成一个 1 到 100 之间的整数
输出类似于:
1.31 µs ± 20.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
这意味着,生成一个随机整数平均需要 1.31 微秒,标准差为 20.6 纳秒。%timeit
运行了 7 轮,每轮运行了 100 万次。
3. 进阶用法:多行代码计时
如果你想对多行代码进行计时,可以使用 %%timeit
魔法命令(注意是两个百分号)。
%%timeit
my_list = []
for i in range(100):
my_list.append(i**2)
%%timeit
会对整个 cell 的代码进行计时。
4. 自定义运行次数
你可以使用 -n
参数指定每轮运行的次数,使用 -r
参数指定运行的轮数。
%timeit -n 100 -r 5 random.randint(1, 100) # 每轮运行 100 次,运行 5 轮
5. 实用技巧:比较不同算法的性能
%timeit
非常适合比较不同算法的性能。例如:
import numpy as np
def using_list_comprehension(n):
return [i**2 for i in range(n)]
def using_numpy(n):
return np.arange(n)**2
n = 1000
print("List Comprehension:")
%timeit using_list_comprehension(n)
print("nNumpy:")
%timeit using_numpy(n)
通过比较输出结果,你可以清楚地看到 numpy
在这种情况下比 list comprehension
更快。
总结:%timeit
的优势
优点 | 描述 |
---|---|
精确计时 | 多次运行取平均值,避免了单次运行的偶然误差。 |
方便易用 | 只需要一行代码即可对代码进行计时。 |
算法性能比较 | 可以方便地比较不同算法的性能,选择最优方案。 |
自动选择运行次数 | 自动选择合适的运行次数,以获得足够精确的结果。 |
第三部分:%matplotlib inline
– 绘图小助手
如果你想在Jupyter Notebook里绘制图表,%matplotlib inline
命令就是你的好帮手。 它可以让你的图表直接显示在Notebook里,而不是弹出一个单独的窗口。
1. 基本用法:嵌入式绘图
%matplotlib inline
只需要在你的绘图代码之前执行这条命令,你的图表就会直接显示在Notebook里。
2. 示例:
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
plt.xlabel("x")
plt.ylabel("sin(x)")
plt.title("Sine Wave")
plt.show() # 显示图表
执行这段代码后,你会在Notebook里看到一个正弦波的图表。
3. 替代方案:%matplotlib notebook
除了 %matplotlib inline
,还有 %matplotlib notebook
。 它们的区别在于:
-
%matplotlib inline
:将图表静态地嵌入到 Notebook 中。这意味着你无法与图表进行交互,例如缩放、旋转等。 -
%matplotlib notebook
:创建一个交互式的图表。你可以使用鼠标缩放、平移、旋转图表,等等。
4. 示例:交互式绘图
import matplotlib.pyplot as plt
import numpy as np
%matplotlib notebook # 切换到交互式模式
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
plt.xlabel("x")
plt.ylabel("sin(x)")
plt.title("Interactive Sine Wave")
plt.show()
执行这段代码后,你会在Notebook里看到一个交互式的正弦波图表。你可以使用鼠标进行缩放、平移等操作。
5. 实用技巧:选择合适的绘图模式
-
如果你只需要查看静态图表,
%matplotlib inline
是一个不错的选择。它简单、快速,而且兼容性好。 -
如果你需要与图表进行交互,例如缩放、平移、旋转等,
%matplotlib notebook
更加适合。但需要注意的是,%matplotlib notebook
可能会有一些兼容性问题,尤其是在一些云端 Notebook 环境中。
总结:%matplotlib
的优势
优点 | 描述 |
---|---|
图表直接显示在Notebook中 | 避免了弹出单独窗口的麻烦,方便查看和分享图表。 |
静态/交互式绘图 | 提供了静态和交互式两种绘图模式,可以根据需要选择合适的模式。 |
兼容性良好(inline 模式) |
%matplotlib inline 兼容性良好,几乎可以在所有环境中使用。 |
交互性强(notebook 模式) |
%matplotlib notebook 提供了丰富的交互功能,例如缩放、平移、旋转等。 |
额外福利:其他常用的魔法命令
除了上面介绍的三个魔法命令,Jupyter Notebook 还有很多其他有用的魔法命令。这里列举一些常用的:
%lsmagic
: 列出所有可用的魔法命令。%pwd
: 显示当前工作目录。%cd
: 改变当前工作目录。%ls
: 列出当前目录下的文件。%history
: 显示历史命令。%reset
: 重置当前会话,清除所有变量。%who
: 列出当前会话中的所有变量。
总结:魔法命令的价值
Jupyter Notebook 的魔法命令就像是你的编程助手,它们可以帮你:
- 提高开发效率:避免重复工作,快速完成任务。
- 简化开发流程:将复杂的任务分解成简单的步骤。
- 增强代码可读性:使代码更加简洁、清晰。
- 提升编程体验:让编程更加愉快、高效。
希望今天的讲座能帮助你更好地理解和使用 Jupyter Notebook 的魔法命令。记住,熟练掌握这些魔法,你也能成为一个真正的编程魔术师!下次见!