如何在IPython Notebook中进行缓存?

问题描述 投票:15回答:4

环境:

  • Python 3
  • IPython 3.2

每次关闭IPython笔记本并重新打开它时,我都必须重新运行所有单元。但是某些单元格涉及密集计算。

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

我看了ipycache,但似乎要缓存一个单元而不是笔记本。在IPython中是否有knitr的缓存的对应项?

python r ipython knitr ipython-notebook
4个回答
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')

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

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

我认为一般来讲,这是一个好习惯,因为它为您提供了备份。您也可以将泡菜用于同一件事。如果您的数据确实很大,则实际上可以gzip.open直接写入zip文件。

编辑

要将scikit学习模型保存到磁盘,请使用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')

4
投票

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

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

它很简单:

%load_ext ipycache

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

%%cache mycache.pkl var1 var2
var1 = 1
var2 = 2

[第一次执行此单元格时,将执行代码,然后变量var1和var2保存在当前的mycache.pkl中目录以及输出。丰富的显示输出仅保存如果使用IPython的开发版本。当您执行此再次显示单元格,跳过代码,从文件并注入到名称空间中,然后将输出还原到笔记本。

它将保存所有图形,产生的输出以及为您自动指定的所有变量:)


3
投票

不幸的是,似乎没有像自动缓存那样方便的东西。 %store魔术选项已关闭,但需要您手动且明确地进行缓存和重新加载。

在Jupyter笔记本中:

a = 1
%store a

现在,假设您关闭笔记本计算机,内核将重新启动。您不再有权访问局部变量。但是,您可以使用-r选项重新加载已存储的变量。]​​>

%store -r a
print a # Should print 1

0
投票

使用cache magic

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