Jupyter Notebook运行代码时内核中途崩溃的解决办法咨询
Langton蚂蚁模拟内核崩溃问题解决方法
问题根源分析
你的代码每次循环都会创建新的Matplotlib图形对象、重复调用plt.show(),还把%matplotlib osx放在循环内反复执行,这会导致内存快速累积泄漏,最终触发Jupyter内核重启。另外极端小的pause值不仅没有实际效果,还会额外消耗系统资源。
具体修复方案
- 将Matplotlib后端配置移到代码最顶部,避免重复执行
- 只初始化一次绘图对象,循环中仅更新图像数据,不再重复创建图形
- 合理设置暂停时间,或按需调整绘图更新频率
- 添加边界检查,防止蚂蚁跑出数组范围引发错误
修改后的代码
import numpy as np import matplotlib.pyplot as plt # 配置Matplotlib后端(Jupyter推荐用notebook,支持交互式绘图) %matplotlib notebook def ant(nx, ny, nmoves, update_interval=10): # 初始化数组,1代表白色,0代表黑色 arr = np.ones((ny, nx)) ix, iy = nx//2, ny//2 dx, dy = 1, 0 # 初始方向向右 # 仅创建一次绘图对象,避免重复创建导致内存泄漏 fig, ax = plt.subplots() img = ax.imshow(arr, cmap='Greys', interpolation='nearest') ax.axis('off') plt.show(block=False) for i in range(nmoves): # 边界检查:防止蚂蚁跑出数组引发索引错误 if not (0 <= ix < nx and 0 <= iy < ny): print(f"蚂蚁在第{i}步跑出边界,停止模拟") break # 执行转向规则 if arr[iy, ix]: dx, dy = dy, -dx # 白色格子右转90度 else: dx, dy = -dy, dx # 黑色格子左转90度 # 翻转当前格子颜色 arr[iy, ix] = 1 - arr[iy, ix] # 更新蚂蚁位置 ix, iy = ix + dx, iy + dy # 每隔N步更新一次图像,减少绘图开销 if i % update_interval == 0: img.set_data(arr) fig.canvas.draw_idle() plt.pause(0.001) # 合理的暂停时间,平衡流畅度与资源占用 # 模拟结束后显示最终状态 img.set_data(arr) fig.canvas.draw_idle() plt.show() # 参数设置 nx = 175 ny = 175 nmoves = 13000 ant(nx, ny, nmoves)
关键改动说明
- 后端适配:用
%matplotlib notebook替代osx,更适配Jupyter环境,资源占用更低且支持交互式操作 - 绘图对象复用:仅初始化一次
fig、ax和img,循环中通过set_data()更新图像数据,彻底避免重复创建图形导致的内存泄漏 - 更新间隔优化:添加
update_interval参数,每隔指定步数才更新一次绘图,大幅降低系统负载 - 边界防护:增加数组边界检查,避免蚂蚁移动到数组外引发索引错误导致崩溃
- 合理暂停时间:将极端小的暂停值调整为
0.001,既保证动画流畅,又不会浪费系统资源
内容的提问来源于stack exchange,提问作者pdridee
相关产品推荐
相关产品推荐

