最可靠方式是统一计时入口+统一输出格式+外部工具比对;code runner需设showexecutionmessage为true、runinterminal和preservefocus为false;手写time.time()须规范输出格式;tasks+diff可自动比对两算法输出;cprofile用于函数级分析而非算法间耗时对比。

直接在 VSCode 里对比两个算法的执行耗时,最可靠的方式是**用统一计时入口 + 统一输出格式 + 外部工具比对**,而不是依赖插件自动“并排显示耗时”。VSCode 本身不提供原生的多文件耗时对比功能,所有“一键对比”方案都需手动组合或脚本驱动。
Code Runner 配置必须关掉终端才能看到 Execution Time
很多人装了 Code Runner 却看不到 Execution Time,根本原因是默认配置没生效:
-
code-runner.showExecutionMessage必须设为true(默认是false) -
code-runner.runInTerminal必须设为false:设成true会新开系统终端,VSCode 内置输出捕获不到耗时信息 -
code-runner.preserveFocus建议设为false:否则焦点切走,你可能根本没看到最后一行Execution Time: 0.214s - 确保 Python/Node.js 等解释器在系统
PATH中,否则连运行都失败,更别说计时
手写 time.time() 要统一格式才方便对比
临时验证单个脚本没问题,但要对比多个算法,就得让它们输出结构一致的时间标记,否则没法肉眼或脚本比对:
- 别用
time.clock():Python 3.8+ 已彻底移除 - 普通算法题用
time.time()足够;time.perf_counter()是给纳秒级压测准备的,反而模糊语义 - 必须把结果打印成固定格式,比如:
print(f"[{__file__}]耗时: {end_time - start_time:.4f}s") - 含
subprocess.run()、requests.get()或asyncio.run()的代码,计时包含等待时间,不代表算法纯计算开销
用 Tasks + diff 实现两个文件输出自动比对
VSCode 的 tasks.json 可以串起运行、重定向、比对三步,比手动开终端高效得多:
{
"version": "2.0.0",
"tasks": [
{
"label": "run-and-diff",
"type": "shell",
"command": "python ${fileBasenameNoExtension}_a.py > /tmp/out_a.txt && python ${fileBasenameNoExtension}_b.py > /tmp/out_b.txt && code --diff /tmp/out_a.txt /tmp/out_b.txt",
"group": "build",
"presentation": {
"echo": true,
"reveal": "always",
"focus": false
}
}
]
}
这样你只需右键任一文件 → “运行任务” → 选 run-and-diff,就能立刻看到两个脚本的标准输出(含耗时)差异。注意路径要统一,比如都叫 algo_a.py 和 algo_b.py,否则 ${fileBasenameNoExtension} 会错配。
cProfile 不适合直接对比,但能定位谁真慢
想看“哪个函数拖慢整体”,别靠肉眼数 Execution Time——两个脚本总耗时接近,但内部热点可能完全不同:
-
cProfile输出的是函数级调用统计,不是单次运行耗时,无法直接用于算法间横向对比 - 真正有用的是看
Self Time和# Calls组合:一个被调 5000 次、每次 2ms 的小函数,实际占满 10 秒,比一个总耗时 8 秒但只调 1 次的大函数更值得优化 - VSCode 自带 Profiler 面板支持打开
.prof文件,但结果不自动保存——关掉就丢,记得点“保存”图标导出.cpuprofile - 对异步逻辑(如
await),cProfile会漏掉协程调度开销,此时得靠console.time()在关键节点打点辅助
最易被忽略的一点:不同算法的输入规模必须严格一致,否则耗时对比毫无意义;而 VSCode 本身不校验这个——它只管跑完、输出、比对,不负责逻辑一致性。











