Jupyter Notebook 效率技巧
python %time sum(range(1000000)) %timeit sum(range(1000000))
- **`%prun`**
用 Python 的性能分析器运行代码,找出耗时函数。
```python
%prun my_slow_function()
-
%debug
当代码抛出异常后,输入%debug会进入事后调试模式,你可以查看变量、逐行追踪。 -
%store与%store -r
在 notebook 之间持久化变量。例如%store df保存 DataFrame,另一个 notebook 用%store -r df恢复。 -
%who / %whos
列出当前命名空间中的变量及其类型,%whos还会显示更多信息,是清理内存前的检查利器。 -
%env
查看或设置环境变量,例如%env MY_VAR=hello。
2.2 单元格魔法命令
-
%%timeit
测量整个单元格的执行时间,自动多次运行。%%timeit import numpy as np arr = np.random.randn(100, 100) np.dot(arr, arr.T) -
%%writefile my_script.py
将单元格内容直接写入一个文件,方便提取模块。 -
%%bash / %%python2
在单元格中运行其他语言的代码(需要对应的内核支持)。%%bash可以执行 shell 命令,非常适合短暂的文件操作。
2.3 外部代码与可视化集成
%load:加载外部脚本到当前单元格,例如%load myscript.py。%run:直接运行外部 Python 脚本,脚本中的变量会进入当前命名空间。%matplotlib inline / notebookinline生成静态图表并嵌入 notebook。notebook(或%matplotlib widget) 启用可交互的绘图,支持缩放、平移等操作。
3. 扩展插件:颠覆 Noteboook 体验
Jupyter Notebook 的强大很大程度上来自社区扩展。通过 jupyter_contrib_nbextensions 可以获得众多功能增强。
安装与开启:
pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
启动 notebook 后,主页会出现 Nbextensions 标签页,勾选即可启用。
3.1 必装扩展推荐
-
Hinterland
在任意代码单元格中提供关键字自动补全,无需按Tab,体验类似现代 IDE。 -
Table of Contents (2)
基于 Markdown 标题自动生成可导航的目录侧边栏,长 notebook 的救星。 -
Collapsible Headings
让你的标题可以折叠区域内的单元格,轻松整理长文档。 -
Notify
长时间运行的单元格完成后,通过浏览器通知提醒你。再也不用频繁切换窗口查看进度。 -
ExecuteTime
在每个单元格下方显示执行的时间和持续时间,帮助定位性能瓶颈。 -
Variable Inspector
类似 MATLAB 的工作区,在一个浮动面板中显示所有变量及其类型、大小和内容摘要。 -
ScrollDown
执行单元格后自动滚动到底部,让输出始终可见。
4. 内核与内存管理技巧
长时间运行的 Notebook 容易内存膨胀、变量污染,以下技巧帮你保持内核清爽。
4.1 快速重启与清输出
不要只依赖手动重启。在 Kernel 菜单中使用:
- Restart & Clear Output:重启内核并擦除所有输出,适合多次试验后得到干净的结果。
- Restart & Run All:从第一个单元格依次重新执行全部,确保笔记本从头到尾可复现。
4.2 变量清理
使用 %reset 命令清除所有变量(会要求确认)。
%reset -f # -f 强制清除,无需确认
如果只想删除部分大对象,可以用 del 并配合 gc 模块:
import gc
del df_large
gc.collect()
4.3 中断长时间运行的内核
点击工具栏的 Stop 按钮或按 I, I (命令模式连按两次 I) 可以中断执行,但不会丢失已有变量。这比直接重启内核更温和。
5. 输出与可视化的精细控制
5.1 省略冗长输出
在 pandas DataFrame 显示中,默认会截断行和列。你可以通过设置选项调整:
import pandas as pd
pd.set_option('display.max_columns', None) # 显示所有列
pd.set_option('display.max_rows', 50) # 最多显示50行
对于任意对象的输出,可以用 ; 抑制最后一个表达式的打印。
5.2 多输出与 Matplotlib 并发图
一个单元格可以有多个输出,无需多次执行。例如:
from IPython.display import display
import pandas as pd
df1 = pd.DataFrame({'A':[1,2]})
df2 = pd.DataFrame({'B':[3,4]})
display(df1, df2)
绘制多个 Matplotlib 图时,在同一个单元格里使用多个 plt.figure() 即可同时渲染。
5.3 富文本与 HTML 输出
通过 IPython.display 的 HTML, Markdown, Image 等可以直接在单元格输出富媒体内容。
from IPython.display import HTML
HTML('<h2 style="color:blue;">自定义标题</h2>')