本节摘要:Magic 命令以
%(单行)或%%(整格)开头,是 IPython 在 Notebook 里的系统级快捷方式。本节按 SOURCE 2.2 梳理计时、绘图、加载/运行脚本、工作目录、变量查看与 %%writefile 等高频命令,并给出误用 %reset 的警告。
阅读完本节,你应当能够:
% 与单元格 Magic %%SOURCE 定义:
%):只作用于当前行(或该行剩余部分)%%):作用于整个单元格第一行起
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 基准 |
SOURCE 的 writefile 示例:
%%writefile test.txt hello world! this is a test file.
会在 Notebook 启动目录写出 test.txt——写库/部署前注意路径权限。
⚠️ 常见坑:
%reset后 DataFrame 全没——长分析中途别手滑。若需清内存,优先del df+gc.collect()(见第 5 章)。
SOURCE 还列有(整格生效):
| Magic | 用途 |
|---|---|
| %%bash | 单元格内跑 Bash(Linux/macOS;Windows 可用 WSL) |
| %%HTML | 渲染 HTML |
| %%latex | 渲染 LaTeX |
| %%javascript | 执行 JS(浏览器端,慎用) |
Magic 是 IPython 扩展,导出为 .py 脚本时不会保留 % 行——长期逻辑应写进 .py 模块,Notebook 里 %run 调用。教学演示和一次性基准测试则是 Magic 的主场。
💡 关键直觉:把 Magic 当「笔记本专用胶水」——计时、清变量、拉脚本;业务算法仍放
.py便于测试与 Git diff。
下一节 2.3 调试技巧 在异常发生后用
%debug进入交互调试器——Magic 的「排错分支」。
| 命令 | 一句话作用 | 典型误用 |
|---|---|---|
| %timeit | 多次运行取最短时间 | 用于耗时数秒的重计算 |
| %%time | 整格一次计时 | 忘记打印结果 |
| %load | 读外部脚本进当前格 | 误以为会立即执行 |
| %run | 执行外部脚本共享命名空间 | 模块改后未重跑 |
| %reset | 清空全部用户变量 | 分析中途手滑 |
| %who / %whos | 列出当前变量 | 与 dir() 混淆 |
| %pwd / %ls | 工作目录与文件列表 | 相对路径定位错误 |
| %%writefile | 把格内容写成文件 | 覆盖同名文件未确认 |
| %matplotlib inline | 内嵌显示图表 | 在 JupyterLab 中多余 |
长分析后段,经常出现"用了哪个变量、哪个是脏数据"说不清的情况。养成习惯:每完成一个分析阶段,执行一次 %whos,看看 DataFrame 和中间列表是否都在预期内。若发现残留的临时变量,用 del 变量名 清理,而不是等 %reset 一刀切。
# 用 %run 复用模块后,检查 df 是否已定义 %run my_pipeline.py print(f"共处理 {df.shape[0]} 行")
IPython 支持在 profile 里预置常用 Magic(例如每次启动自动执行 %matplotlib inline)。团队场景更稳妥的做法是在 00 导读或 README 里写清"首格运行 %matplotlib inline",避免新同事漏执行导致图片不显示。
Magic 也支持参数。%timeit -n 3 -r 2 控制循环次数与重复轮次;%env PYTHONHASHSEED=42 临时设置环境变量再跑下一格,适合复现随机性强的实验。注意 %env 只影响当前内核进程,关闭内核即失效。
%env MY_VAR = hello import os print(os.environ.get("MY_VAR"))
%ls 是 Magic,ls 单独写会报语法错误(除非在 %%bash 里)。!pip install pandas 是 shell 转义,装到当前内核环境,不是 Magic。%%capture 捕获格内全部输出,适合静默跑安装或清理命令。把它们和 2.2 的计时、变量、文件类 Magic 一起记,就覆盖了日常九成场景。
新建两个单元格,分别用列表推导和 for 循环生成一万个平方数,用 %timeit 各测一次,记录两个数字的差距。再把结果写进 Markdown 格:哪种写法快、差距大概几倍、为什么。这个练习把 2.2 的计时、2.3 的调试(如果写错了)、3.2 的向量化直觉一次串起来。
做完后执行 %whos 看看会话里有哪些变量,体会命名空间审计的实际手感。