环境:
每次关闭IPython笔记本并重新打开它时,我都必须重新运行所有单元。但是某些单元格涉及密集计算。
相反,R中的knitr
默认将结果保存在缓存目录中,因此只有新代码和新设置才会调用计算。
我看了ipycache
,但似乎要缓存一个单元而不是笔记本。在IPython中是否有knitr
的缓存的对应项?
您能举例说明您要做什么吗?当我在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')
事实上,您所要求的功能已经存在,无需通过执行转储来手动重新实现它。
您可以使用%store或更好的%% cache魔术(扩展名)来存储这些间歇性单元格的结果,因此不必重新计算它们(请参阅https://github.com/rossant/ipycache)
它很简单:
%load_ext ipycache
然后,在单元格中,例如:
%%cache mycache.pkl var1 var2
var1 = 1
var2 = 2
[第一次执行此单元格时,将执行代码,然后变量var1和var2保存在当前的mycache.pkl中目录以及输出。丰富的显示输出仅保存如果使用IPython的开发版本。当您执行此再次显示单元格,跳过代码,从文件并注入到名称空间中,然后将输出还原到笔记本。
它将保存所有图形,产生的输出以及为您自动指定的所有变量:)
不幸的是,似乎没有像自动缓存那样方便的东西。 %store
魔术选项已关闭,但需要您手动且明确地进行缓存和重新加载。
a = 1
%store a
现在,假设您关闭笔记本计算机,内核将重新启动。您不再有权访问局部变量。但是,您可以使用-r
选项重新加载已存储的变量。]>
%store -r a
print a # Should print 1
使用cache magic。