使用 Jupyter Notebook 的 VS 代码在重新运行单元时非常慢

问题描述 投票:0回答:1

我在 vscode 中使用 Jupyter 时遇到了问题。在 vs code 启动时,我的 10 个单元格在大约 3-4 分钟内以完全合理的方式“运行全部”(加载数据和繁重的计算需要时间,但绘图速度很快,等等)。但重新运行单元有时需要很长时间。

作为示例,最后一个单元格(仅绘制数据)在“全部运行”上花费了 1.6 秒。当我立即重新运行最后一个单元格(即使根本不更改代码)时,运行时间会更长(最多 14 分钟!)。这是为什么?

这不是 CPU 或内存问题,因为在运行期间它们分别仅攀升至 30% 和 75%。

我在 Jupyter 笔记本服务器上看到过同样的错误。解决方案是禁用“Variable Inspector nbextension”。在 vs code 上运行 jupyter 笔记本时是否有等效的解决方案?

更新:只有当“Jupyter:变量”窗格打开时才会出现这种情况。很多变量显示为无限加载。问题可能是变量太大而无法显示?

版本:vs code 1.73.1 / Jupyter v2022.9.1303220346 / Python 3.10.8 / Windows 11

注意:我有 pandas 变量,就像上面链接中的问题一样。

python visual-studio-code jupyter-notebook
1个回答
0
投票
可能的原因

没有具体的代码示例,我无法确定是什么导致了您的问题。

但是,我可以告诉您,此问题的一个常见原因是“Jupyter:变量”窗口。当您在 VS Code、Spyder 或其他基于 Jupyter 的 IDE 中打开此窗口时,IDE 将运行一段 Python 代码以获取代码的“表示形式”以放入变量窗口中。

这是由 IDE 通过调用 Python 函数

repr()

 执行如下操作来完成的:

# representation would be a string representation = repr(your_python_object) print_to_variable_window(representation)
如果您的代码需要很长时间来格式化和生成表示,这可能会导致运行代码相当快,但重新运行代码需要很长时间,因为 Jupyter 会等待之前更新变量窗口实际运行你的代码。

重现问题

如果您定义的 Python 对象的

__repr__()

 方法需要很长时间才能运行,则可能会导致“Jupyter:变量”窗口需要很长时间才能加载。这可能是由非常长的字符串、列表或其他系统尝试创建大量数据的表示引起的。或者,(主要用于演示目的),可以在 repr 中调用 sleep() ,如下所示:

import time class Hello: def __init__(self): self.count = 0 def __repr__(self): self.count += 1 time.sleep(10) return f"Hello. Repr has been called {self.count} times" # %% Next Jupyter Cell hello = Hello() print("Hi")
当我在 VS Code 中运行此代码并打开“Jupyter:变量”窗口时,该代码第一次运行得非常快,大约 50 秒后我在变量窗口中看到“Hello.Repr 已被调用 1 次”。

如果我尝试再次运行任一单元格,则运行时间明显较长,最终我会在“Jupyter:变量”窗口中看到“Hello。Repr 已被调用 5 次”。

可能的解决方案

  1. 关闭“Jupyter:变量”窗口。这是特定于“Jupyter:变量”工作方式的问题,如果不使用它,当“Jupyter:变量”关闭时,您不应该遇到此问题。

  2. 重新启动内核。虽然重新启动内核意味着您无法运行 Python 脚本中的单个单元,但重新启动内核将使您能够执行“全部运行”,并且将防止计算机花费大量时间尝试生成先前的变量。

  3. 找出 Python 环境中导致代码运行缓慢的变量。很可能,您的 Python 环境中有一个变量需要很长时间才能创建其表示,这就是问题的直接原因。

这可能是一个简单的有一个巨大的字符串,例如:

# Warning! This will create a string that consumes ~750 MB of RAM x = ["abcdefg" * 10_000_000] * 10_000_000
要查找是否存在特定的违规变量,您可以在 Jupyter 单元中运行一个像这样的小脚本。

for key, value in globals().copy().items(): # Ignore special system objects if key.startswith("_"): continue print(key) print(repr(value))
在打印导致问题的变量名称后,脚本将挂起并花费很长时间。

© www.soinside.com 2019 - 2024. All rights reserved.