如何在IPython Notebook中缓存?

Zel*_*ong 16 python r ipython knitr ipython-notebook

环境:

  • Python 3
  • IPython 3.2

每当我关闭一个IPython笔记本并重新打开它时,我必须重新运行所有单元格.但是一些细胞涉及密集计算.

相比之下,knitr在R中默认将结果保存在缓存目录中,因此只有新代码和新设置才会调用计算.

我看了一下,ipycache但似乎缓存了一个单元而不是笔记本.knitr在IPython中有缓存的对应物吗?

小智 9

不幸的是,似乎没有像自动缓存那样方便的东西。该%store魔术选项是关闭的,但需要你做缓存和手动和明确重装。

在您的 Jupyter 笔记本中:

a = 1
%store a
Run Code Online (Sandbox Code Playgroud)

现在,假设您关闭笔记本并重新启动内核。您不再可以访问局部变量。但是,您可以使用该-r选项重新加载已存储的变量。

%store -r a
print a # Should print 1
Run Code Online (Sandbox Code Playgroud)


ntg*_*ntg 6

事实上,您要求的功能已经存在,无需通过执行 dumps 手动重新实现它。

您可以使用 %store 或更好的 %%cache 魔法(扩展)来存储这些间歇性单元格的结果,因此不必重新计算它们(请参阅https://github.com/rossant/ipycache )

它很简单:

%load_ext ipycache
Run Code Online (Sandbox Code Playgroud)

然后,在一个单元格中,例如:

%%cache mycache.pkl var1 var2
var1 = 1
var2 = 2
Run Code Online (Sandbox Code Playgroud)

当您第一次执行此单元格时,将执行代码,并且变量 var1 和 var2 与输出一起保存在当前目录的 mycache.pkl 中。仅当您使用 IPython 的开发版本时才会保存丰富的显示输出。再次执行此单元格时,将跳过代码,从文件加载变量并注入命名空间,并在笔记本中恢复输出。

它会保存所有图形、生成的输出以及为您自动指定的所有变量:)

  • `ipycache` 似乎需要很多爱。大量警告,上次更新时间为 2016 年 5 月。 (2认同)
  • `ipycache` 不再维护,你知道另一个工具吗? (2认同)

小智 0

你能举例说明你正在尝试做什么吗?当我在 IPython Notebook 中运行一些昂贵的东西时,我几乎总是事后将其写入磁盘。例如,如果我的数据是 JSON 对象列表,我会将其作为行分隔的 JSON 格式字符串写入磁盘:

with open('path_to_file.json', 'a') as file:
    for item in data: 
        line = json.dumps(item)
        file.write(line + '\n')
Run Code Online (Sandbox Code Playgroud)

然后您可以以相同的方式读回数据:

data = []
with open('path_to_file.json', 'a') as file:
    for line in file: 
        data_item = json.loads(line)
        data.append(data_item)
Run Code Online (Sandbox Code Playgroud)

我认为一般来说这是一个很好的做法,因为它为您提供了备份。你也可以使用pickle来做同样的事情。如果您的数据真的很大,您实际上可以gzip.open直接写入 zip 文件。

编辑

要将 scikit learn 模型保存到磁盘,请使用joblib.pickle.

from sklearn.cluster import KMeans

km = KMeans(n_clusters=num_clusters)
km.fit(some_data)


from sklearn.externals import joblib
# dump to pickle
joblib.dump(km, 'model.pkl')

# and reload from pickle
km = joblib.load('model.pkl')
Run Code Online (Sandbox Code Playgroud)