Python高级技术之:`Jupyter Notebook`的魔法命令:`%run`、`%timeit`和`%matplotlib inline`的用法。

各位,早上好!今天我们来聊聊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 的魔法命令。记住,熟练掌握这些魔法,你也能成为一个真正的编程魔术师!下次见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注