完全禁用IPython输出缓存

16

我在IPython中处理一些GB级的numpy数组。当我删除它们时,我肯定希望它们消失,以便恢复内存。但是,IPython的输出缓存非常烦人,因为即使删除了对它们的最后一个有意的引用,它仍会保持这些对象的存活状态。我已经设置好了。

c.TerminalInteractiveShell.cache_size = 0
在IPython配置中,但这只禁用了对_oh条目的缓存,其他变量如___等仍然会被创建。我也知道%xdel,但无论如何,我都更喜欢将其完全禁用,因为我很少使用输出历史记录,所以一个简单的del就可以立即起作用。

1
只有在显示大数组时,它们才会被分配到缓存(_等)。赋值x=largearraylargearray;会抑制这种情况。 - hpaulj
1
是的,但是为了显示它们,我总是不得不使用print,而不是只输入变量名。所以我仍然回到同样的问题,如何避免这种情况。 - Michael
通常,仅显示形状或大数组的一部分(例如前10行或列)比显示整个数组更有用。在旧版MATLAB上尤其如此,因为它在显示大数组时不使用省略号。 - hpaulj
4个回答

6

看着 IPython/core/displayhook.py 第 209-214 行的代码,我认为它是不可配置的。你可以尝试创建一个 PR 来添加一个选项来完全禁用它。


3
这给了我正确的思路!仔细查看代码,它检查 _ 是否存在于 - 根据版本不同 - __builtin__IPython.core.py3compat.builtin_mod 中。因此,在 __builtin__._ = True 之后,历史记录就被清除了!谢谢! - Michael
哦,我猜你把它放在启动文件夹里,然后就可以了 :-) - Matt
1
答案在Jupyter下不再起作用。即使c.TerminalInteractiveShell.cache_size = 0也不起作用。我该如何禁用Out和_?@Matt - Gioelelm
好的,答案显示无事可做,这是不可配置的。这似乎仍然是真的。Out 似乎来自于这里,因此也不可配置,除非有人发送补丁和/或打开问题。 - Matt
尝试在.ipython/profile_default/ipython_config.py中设置c.InteractiveShell.cache_size = 0 - Louis Yang
显示剩余2条评论

6

输入

echo "__builtin__._ = True" > ~/.config/ipython/profile_default/startup/00-disable-history.py

并且你的历史记录应该已经被删除了。

编辑:

似乎配置目录的路径有时会有所不同,可以是~/.config/ipython或者是~/.ipython/。因此,请检查您使用的路径并相应地调整路径。该解决方案仍然适用于jupyter console


每次启动 iPython 都会禁用历史记录吗? - joshlk

3

1
创建一个IPython配置文件:
!ipython profile create

输出可能是(对于ipython v4.0):

[ProfileCreate] Generating default config file: '/root/.ipython/profile_default/ipython_config.py'
[ProfileCreate] Generating default config file: '/root/.ipython/profile_default/ipython_kernel_config.py'

然后在ipython_kernel_config.py文件中添加一行'c.InteractiveShell.cache_size = 0'

!echo 'c.InteractiveShell.cache_size = 0' >> /root/.ipython/profile_default/ipython_kernel_config.py

加载另一个IPython内核并检查其是否正常工作。
In [1]: 123
Out[1]: 123

In [2]: _1
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-51-21553803e553> in <module>()
----> 1 _1

NameError: name '_1' is not defined

In [3]: len(Out)
Out[3]: 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接