Completely disable IPython output caching
Asked Answered
B

4

17

I'm dealing with some GB-sized numpy arrays in IPython. When I delete them, I definitely want them gone, in order to recover the memory. IPythons output cache is quite annoying there, as it keeps the objects alive even after deleting the last actively intended reference to them. I already set

c.TerminalInteractiveShell.cache_size = 0

in the IPython configuration, but this only disables caching of entries to _oh, the other variables like _, __ and so on are still created. I'm also aware of %xdel, but anyways, I'd prefer to disable it completely, as I rarely use the output history anyways, so that a plain del would work again right away.

Bel answered 28/12, 2013 at 13:4 Comment(3)
Those large arrays get assigned to the cache (_ etc) only if you display them, don't they? Assignment x=largearray and largearray; suppress that.Supernatant
True, but for displaying them I always had to use print then instead of just typing the variable name. So I'm still back to the same question, how to avoid that.Bel
Often it is more useful to display just the shape, or a slice of a large array (e.g. first 10 rows or columns), rather than the whole thing. That was especially true on old MATLAB which didn't use ellipsis when displaying large arrays.Supernatant
B
6

Looking at IPython/core/displayhook.py Line 209-214 I would say that it is not configurable. You could try making a PR to add an option to disable it totally.

Barrios answered 28/12, 2013 at 17:56 Comment(7)
This actually gave me the right idea! Look closer into the code, it checks for _ being present in - depending on version - __builtin__ or IPython.core.py3compat.builtin_mod. So after __builtin__._ = True, the history is gone! Thanks!Bel
Oh, and I suppose you put that in your startup folder and then, it's definitive :-)Barrios
@Bel would you care to change your comment into an answer, maybe adding a little bit detail on what you did? I'd like to do the same thing as you but I'i'd rather not tinker with it and use (and upvode) canned solution.Groggy
@jb I added an answer below.Bel
The answer is not longer working under Jupyter. Not even c.TerminalInteractiveShell.cache_size = 0 is working. How do I disable both Out and _? @BarriosHydrosol
Well, the answer says there is nothing to do, that's not configurable. Which seem to still be true. Out seem to come from here so not configurable either, unless someone send a patch and/or open an issue.Barrios
Try to set c.InteractiveShell.cache_size = 0 in .ipython/profile_default/ipython_config.py.Drusy
B
6

Enter

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

and your history should be gone.

Edit:

Seems like the path to the config directory is sometimes a bit different, either ~/.config/ipython or just ~/.ipython/. So just check which one you got and adjust the path accordingly. The solution still works with jupyter console.

Bel answered 11/7, 2014 at 14:32 Comment(1)
Does this disable history every time you start up iPython?Serviette
C
3

Seems that we can suppress the output cache by putting a ";" at the end of the line now.

See http://ipython.org/ipython-doc/stable/interactive/tips.html#suppress-output

Colloquial answered 25/3, 2015 at 2:41 Comment(0)
D
1

Create an ipython profile:

!ipython profile create

The output might be (for 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'

Then add the line 'c.InteractiveShell.cache_size = 0' to the ipython_kernel_config.py file by

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

Load another ipython kernel and check if this work

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
Drusy answered 1/3, 2019 at 22:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.