%%time 测的是提交时间而非执行完成时间,gpu 计算需用 torch.cuda.synchronize() 同步;wall time 远大于 cpu times 时提示存在 i/o、等待或异步未同步;精确测速应优先用 %%timeit。

直接用 %%time 就能测整个单元格的总耗时,但默认不等 GPU 计算完成,容易误判性能。
%%time 必须放在单元格第一行
它不是普通函数,而是单元格级魔法命令,位置错就失效:
-
%%time必须独占第一行,后面不能跟任何代码或空格 - 第二行开始才是你要计时的代码,哪怕只有一行也要换行写
- 如果写成
%%time import torch,Jupyter 会报错SyntaxError: invalid syntax
%%time 测的是“提交时间”,不是“执行完成时间”(尤其对 CUDA)
PyTorch/TensorFlow 在 GPU 上的操作默认异步,%%time 只记录到任务提交完毕、控制权交还 Python 的那一刻:
- 比如
z = torch.mm(x.cuda(), y.cuda()),%%time可能只显示几毫秒 - 真实计算耗时要靠
torch.cuda.synchronize()强制等待 GPU 完成 - CPU 上的纯计算(如
sorted(list(range(10**6))))不受此影响,%%time结果可信
Wall time 和 CPU times 不一致时,说明有阻塞或并发行为
输出里同时出现两组时间,它们含义不同:
-
CPU times: user X ms, sys Y ms—— 真实占用 CPU 的时间总和 -
Wall time: Z ms—— 从开始到结束的真实流逝时间 - 当
Z >> X + Y,常见于:磁盘 I/O、网络请求、time.sleep()、多线程等待、GPU 异步未同步
需要多次运行取平均?换用 %%timeit
%%time 只跑一次,受系统负载、缓存、预热影响大;稳定对比建议用 %%timeit:
-
%%timeit自动多次执行(默认 7 轮,每轮自动决定迭代次数),返回均值 ± 标准差 - 它忽略第一行代码(常用来做初始化,比如
x = torch.randn(...).cuda()),从第二行起计时 - 若要包含初始化,得把所有代码写进同一行,或改用
%timeit+ 手动拼接字符串
真正容易被忽略的点是:GPU 同步和 Wall/CPU 时间差的诊断价值——它不是误差,而是线索。没加 torch.cuda.synchronize() 却拿 %%time 结论说“GPU 没加速”,等于拿枪打靶却忘了瞄准镜校准。











