我在 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 变量,就像上面链接中的问题一样。
但是,我可以告诉您,此问题的一个常见原因是“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 会等待之前更新变量窗口实际运行你的代码。重现问题
__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 次”。
可能的解决方案
# 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))
在打印导致问题的变量名称后,脚本将挂起并花费很长时间。