魔法命令仅在jupyter/ipython中生效,%time测单次耗时(含i/o/gpu同步),%timeit测稳定性能但不支持副作用语句;%run默认隔离命名空间,加-i可导入变量;%%writefile路径相对启动目录;自定义魔法需确保模块可导入且正确注册。

魔法命令不是 Python 语法,不能在普通 Python 脚本里运行,只在 Jupyter Notebook 或 IPython 交互环境中生效。
%time 和 %timeit 怎么选?
测单次耗时用 %time,比如初始化一个大张量或加载数据;需要排除偶然抖动、看稳定性能就用 %timeit。
-
%time返回 CPU 时间、Wall 时间,适合观察含 I/O 或 GPU 同步的操作(如%time torch.cuda.synchronize()) -
%timeit默认执行 7 次预热 + 若干轮测量,自动选择最佳计时方式;但不支持带副作用的语句(比如%timeit x.append(1)会重复调用导致结果膨胀) - 两者都不能跨行——
%time后面只能跟**一行可执行语句**,想测多行请改用%%time
为什么 %run script.py 之后变量没出现在当前命名空间?
默认情况下 %run 是在干净的子命名空间中执行脚本,跑完就丢,所以不会污染当前变量表。这不是 bug,是设计行为。
- 加
-i参数可导入到当前命名空间:%run -i data_loader.py - 加
-g参数强制全局执行(慎用,可能覆盖已有变量) - 如果脚本里用了
if __name__ == "__main__":,%run仍会触发该分支——它等价于直接把脚本内容“粘贴”进当前 cell 执行
%%writefile 写文件时路径怎么算?
%%writefile 的路径是相对于 Jupyter 启动时的**工作目录**,不是 notebook 文件所在目录。
- 用
%pwd确认当前工作目录,再写相对路径(如%%writefile ./src/utils.py) - 绝对路径也支持,但注意 Windows 下反斜杠要转义或用原始字符串:
%%writefile C:\temp\config.json - 如果目标目录不存在,
%%writefile不会自动创建父目录,会报FileNotFoundError,得先用%mkdir -p创建
自定义魔法命令为什么加载失败?
常见原因是模块路径不对或注册函数没被正确发现,不是语法写错。
- 扩展文件(如
my_magic.py)必须能被 Python 导入:要么在 sys.path 里,要么用%run手动执行一遍再%load_ext my_magic -
@register_line_magic装饰的函数名就是命令名,比如函数叫hello,就用%hello world,不能写成%my_magic.hello - 如果提示
No module named 'my_magic',说明 IPython 没找到模块;用import sys; print(sys.path)检查路径,或把文件放到~/.ipython/extensions/下并重启 kernel
真正容易被忽略的是上下文隔离:魔法命令能访问当前命名空间里的变量,但它们自己运行时的局部变量不会泄露出来——比如 %whos 显示变量列表,但它内部生成的临时对象你根本看不见,也不该依赖。











