卡顿主因是notebook文件过大(如178mb)及输出缓存堆积,需先清理output、迁移关键cell,再优化内核休眠与显示阈值,而非仅调代码或配置。

为什么一改代码就卡十几秒?先查 notebook 文件大小
VS Code 里 Jupyter 卡顿,但改一行再运行就慢得离谱,大概率不是内核或代码问题,而是 notebook.ipynb 文件本身膨胀了。178 MB 的 notebook 在 VS Code 中加载、解析、序列化都会严重拖慢响应。
- 用文件管理器右键查看 notebook 文件大小,超过 50 MB 就该警惕
- 不要直接清空整个文件——先复制一份备份,再新建 notebook,把关键 cell 逐步迁移过去
- 旧 notebook 里残留的
output(尤其是图片、大表格、plotly或bokeh的 JSON 渲染结果)是主要元凶,这些内容不会随del或重启内核消失 - VS Code 默认不压缩输出,关掉自动保存输出:在设置里搜索
jupyter.askForKernelRestartOnFileChange,设为false;同时勾选jupyter.clearAllOutputsWhenRunAll
内核内存越跑越高?别只靠 gc.collect()
gc.collect() 只能回收 Python 垃圾,对内核进程里累积的变量引用、缓存对象、未释放的绘图句柄基本无效。真正起效的是主动切断引用 + 重启边界控制。
- 执行完数据处理后,立刻
del df, large_array, model—— 不要等最后统一清理 - 避免在 notebook 全局作用域反复赋值同名变量(比如多次
df = pd.read_csv(...)),每次都会叠加引用 - 在
~/.jupyter/jupyter_notebook_config.py里加这两行,让闲置内核自动“休眠”:c.MappingKernelManager.cull_idle_timeout = 600(10 分钟无操作就回收)c.MappingKernelManager.cull_interval = 120(每 2 分钟检查一次) - 如果用 VS Code,右键单元格选
Clear Output比%clear更彻底;%reset -f会清空所有变量,但不会释放已分配的内存页
输出爆炸导致浏览器卡死?从源头限流
一个 pd.DataFrame 显示 10 万行,或者 20 张 matplotlib 图表堆在一起,前端渲染压力远超计算压力。Jupyter 把输出序列化成 JSON 再传给浏览器,大输出等于大传输 + 大解析。
- 提前设好 pandas 显示阈值:
pd.set_option('display.max_rows', 30)、'display.max_columns', 8 - 禁用交互式后端:
%matplotlib inline(不是widget或nbagg),减少前端 JS 负载 - 批量绘图时,每个
plt.show()后加plt.close('all'),防止 figure 对象堆积 - 对大型中间结果,用
print(type(obj), sys.getsizeof(obj))查体积,别等它被输出才发觉是 GB 级对象
配置文件改错反而更慢?记住三个关键开关
Jupyter Server 配置不是越多越好。写错参数或启用冲突功能,会导致启动变慢、连接超时、甚至拒绝服务。
- 只改这三项,其他保持默认:
c.NotebookApp.iopub_data_rate_limit = 10000000(提升输出带宽,防中断)c.ResourceUseDisplay.track_memory = True(开启右上角内存监控)c.ServerApp.rate_limit_window = 3(放宽 API 请求频控) - 不要碰
c.KernelManager.memory_limit—— 它限制的是内核进程总内存,设小了会直接 kill 进程,设大了没用(OS 层面不限制) - 禁用所有非必要扩展:VS Code 中关掉
Pylance的 full type checking、关掉Jupyter扩展的enablePythonTracebacks,它们会在每次执行时做额外分析
真正卡顿的点往往藏在 notebook 文件体积、输出缓存和内核生命周期管理里,而不是代码本身。优化优先级:先删 output,再拆 notebook,最后调配置。











