2.2 魔法命令(Magic Commands)


2.2 魔法命令(Magic Commands)

本节摘要:Magic 命令以 %(单行)或 %%(整格)开头,是 IPython 在 Notebook 里的系统级快捷方式。本节按 SOURCE 2.2 梳理计时、绘图、加载/运行脚本、工作目录、变量查看与 %%writefile 等高频命令,并给出误用 %reset 的警告。

核心问题

阅读完本节,你应当能够:

  1. 区分行 Magic % 与单元格 Magic %%
  2. 用 %time/%timeit 与 %%time/%%timeit 测量性能
  3. 用 %matplotlib inline 内嵌图表、%load/%run 复用外部脚本
  4. 用 %pwd、%ls、%who、%whos 查看环境与变量
  5. 理解 %reset 会清空命名空间的风险

一、两类 Magic

SOURCE 定义:

  • 行 Magic(%:只作用于当前行(或该行剩余部分)
  • 单元格 Magic(%%:作用于整个单元格第一行起

Magic 命令分类速览

Magic 命令分类速览

二、计时:time 与 timeit

SOURCE 示例对比:

import time %time time.sleep(2) # 单次 sleep 约 2s
%%time import time time.sleep(1) print("hello world")

%timeit 多次运行取平均,适合微基准:

%timeit [i**2 for i in range(1000)]
%%timeit temp = [] for i in range(1000): temp.append(i**2)
命令 作用域 适用
%time 单行一次 粗看慢操作
%timeit 单行多次 对比两种写法
%%time 整格一次 多语句块总耗时
%%timeit 整格多次 整段 pipeline 基准

三、绘图、文件与目录

  • %matplotlib inline:Notebook 内嵌显示 Matplotlib 图(旧环境常需首格执行)
  • %load script.py:把外部脚本内容加载进当前单元格(不立即执行,需再 Shift+Enter)
  • %run script.py:直接运行外部脚本,共享当前命名空间
  • %pwd:当前工作目录
  • %ls:列目录(类 shell)
  • %history:IPython 历史命令

SOURCE 的 writefile 示例:

%%writefile test.txt hello world! this is a test file.

会在 Notebook 启动目录写出 test.txt——写库/部署前注意路径权限。

四、变量与命名空间

  • %who:仅变量名列表
  • %whos:类型、长度、部分值摘要
  • %reset:删除当前 Notebook 内核里所有用户变量

⚠️ 常见坑%reset 后 DataFrame 全没——长分析中途别手滑。若需清内存,优先 del df + gc.collect()(见第 5 章)。

五、其他单元格 Magic

SOURCE 还列有(整格生效):

Magic 用途
%%bash 单元格内跑 Bash(Linux/macOS;Windows 可用 WSL)
%%HTML 渲染 HTML
%%latex 渲染 LaTeX
%%javascript 执行 JS(浏览器端,慎用)

六、Magic 与纯 Python 的边界

Magic 是 IPython 扩展,导出为 .py 脚本时不会保留 % 行——长期逻辑应写进 .py 模块,Notebook 里 %run 调用。教学演示和一次性基准测试则是 Magic 的主场。

💡 关键直觉:把 Magic 当「笔记本专用胶水」——计时、清变量、拉脚本;业务算法仍放 .py 便于测试与 Git diff。

本章回顾

  • % vs %%:单行 vs 整格
  • %timeit:性能对比首选
  • %load / %run:复用外部代码两种语义
  • %who / %whos:快速审计命名空间
  • %reset:清空一切,谨慎使用
  • %%writefile:从格内生成文件

下一节 2.3 调试技巧 在异常发生后用 %debug 进入交互调试器——Magic 的「排错分支」。

高频 Magic 快查表

命令 一句话作用 典型误用
%timeit 多次运行取最短时间 用于耗时数秒的重计算
%%time 整格一次计时 忘记打印结果
%load 读外部脚本进当前格 误以为会立即执行
%run 执行外部脚本共享命名空间 模块改后未重跑
%reset 清空全部用户变量 分析中途手滑
%who / %whos 列出当前变量 与 dir() 混淆
%pwd / %ls 工作目录与文件列表 相对路径定位错误
%%writefile 把格内容写成文件 覆盖同名文件未确认
%matplotlib inline 内嵌显示图表 在 JupyterLab 中多余

命名空间审计实战

长分析后段,经常出现"用了哪个变量、哪个是脏数据"说不清的情况。养成习惯:每完成一个分析阶段,执行一次 %whos,看看 DataFrame 和中间列表是否都在预期内。若发现残留的临时变量,用 del 变量名 清理,而不是等 %reset 一刀切。

为什么 %load 和 %run 语义不同

  • %load script.py:把 script.py 的文本拉进当前单元格,光标定位到内容,按 Shift+Enter 才执行。适合"先看看再跑"。
  • %run script.py:直接执行,且与当前 Notebook 共享命名空间,脚本里定义的变量、函数在当前会话可用。适合把测试函数或数据处理流程抽到 .py 后回 Notebook 调用。
# 用 %run 复用模块后,检查 df 是否已定义 %run my_pipeline.py print(f"共处理 {df.shape[0]} 行")

把常用 Magic 固化进启动脚本

IPython 支持在 profile 里预置常用 Magic(例如每次启动自动执行 %matplotlib inline)。团队场景更稳妥的做法是在 00 导读或 README 里写清"首格运行 %matplotlib inline",避免新同事漏执行导致图片不显示。

Magic 与普通 Python 的分工建议

  • 交互验证、计时、加载:用 Magic。
  • 业务逻辑、可复用函数:写 .py,用 %run 进来。
  • 导出 .py 后仍要保留的代码:不要写 % 行,写成普通 Python 再在 Notebook 中 %run。

参数化与 %env

Magic 也支持参数。%timeit -n 3 -r 2 控制循环次数与重复轮次;%env PYTHONHASHSEED=42 临时设置环境变量再跑下一格,适合复现随机性强的实验。注意 %env 只影响当前内核进程,关闭内核即失效。

%env MY_VAR = hello import os print(os.environ.get("MY_VAR"))

常见的"看着像 Magic 其实不是"

  • %ls 是 Magic,ls 单独写会报语法错误(除非在 %%bash 里)。
  • !pip install pandas 是 shell 转义,装到当前内核环境,不是 Magic。
  • %%capture 捕获格内全部输出,适合静默跑安装或清理命令。

把它们和 2.2 的计时、变量、文件类 Magic 一起记,就覆盖了日常九成场景。

练习:用 Magic 完成一次性能对比

新建两个单元格,分别用列表推导和 for 循环生成一万个平方数,用 %timeit 各测一次,记录两个数字的差距。再把结果写进 Markdown 格:哪种写法快、差距大概几倍、为什么。这个练习把 2.2 的计时、2.3 的调试(如果写错了)、3.2 的向量化直觉一次串起来。

做完后执行 %whos 看看会话里有哪些变量,体会命名空间审计的实际手感。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U