如何在IPython笔记本中缓存?

如何在IPython笔记本中缓存?,python,r,ipython,knitr,ipython-notebook,Python,R,Ipython,Knitr,Ipython Notebook,环境: Python 3 伊皮顿3.2 每次我关闭IPython笔记本并重新打开它时,我都必须重新运行所有的单元。但有些单元涉及密集的计算 相比之下,默认情况下,R中的knitr会将结果保存在缓存目录中,这样只有新代码和新设置才会调用计算 我查看了ipycache,但它似乎在缓存一个单元格而不是笔记本。IPython中是否有与knitr的缓存相对应的缓存?您能举个例子说明您正在尝试做什么吗?当我在IPython笔记本上运行一些昂贵的东西时,我几乎总是在事后将其写入磁盘。例如,如果我的数据是J

环境:

  • Python 3
  • 伊皮顿3.2
每次我关闭IPython笔记本并重新打开它时,我都必须重新运行所有的单元。但有些单元涉及密集的计算

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


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

您能举个例子说明您正在尝试做什么吗?当我在IPython笔记本上运行一些昂贵的东西时,我几乎总是在事后将其写入磁盘。例如,如果我的数据是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
magic选项已关闭,但需要手动显式执行缓存和重新加载

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

%store -r a
print a # Should print 1

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

您可以使用%store或更好的%%cache magic(扩展名)来存储这些间歇单元格的结果,这样就不必重新计算它们(请参阅)

这很简单:

%load_ext ipycache
然后,在单元格中,例如:

%%cache mycache.pkl var1 var2
var1 = 1
var2 = 2
第一次执行此单元格时,将执行代码,并且 变量var1和var2保存在当前数据库中的mycache.pkl中 目录以及输出。仅保存丰富的显示输出 如果您使用IPython的开发版本。当你执行这个 单元格,代码被跳过,变量从 文件,并将其注入命名空间,输出将在 笔记本

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

使用

这将计算一些慢计算(一些“参数”)一次。在随后的调用中,它从存储中恢复myVar


实际上,它与公认的答案几乎相同。

我不知道Ipython是否有这样的功能,但你可以简单地将昂贵的计算缓存到磁盘上,例如。我尝试将机器学习模型应用于数据集。例如,我通过pandas导入了一些数据(几百MB),然后通过scikit learn训练和测试了两个模型。我想“缓存”所有中间转换的数据帧,以及经过训练的模型。这样我就可以在中间数据帧上“进行”实验,而无需从地面读取。@zelong好的,你应该使用
joblib
来pickle你的
sklearn
模型。见我的编辑上面。要将数据帧写入磁盘,只需使用
dataframe.to_csv('yourfile.csv)
非常感谢。scikit学习模型的酸洗看起来相当不错。我尝试了很多关于数据帧的争论,似乎需要将一堆中间数据帧保存到csv文件中。但是IPython似乎没有提供与
RData
缓存相对应的缓存,它将所有内容都放在一个多维数据集中。我删除了
file.close()
调用,因为
带有
。另外:由于
数据
是一个“列表”,因此可以更简单地执行
json.dump(数据,文件)
,而不需要任何循环。同样地,
json.load(file)
。非常有用,而且比
%autoreload
更容易为我工作(我的另一种方法是修改模块,但不想重新加载数据)
ipycache
似乎需要很多爱。警告太多了,最后一次更新是2016年5月。该死,它过去维护率很低:我想随着python版本的发展,情况会发生变化。。。仍然有一些美好的回忆,我找到的最好的解决方案是找到更好/更活跃的东西。
%store
有什么区别?
ipycache
不再被维护,你知道另一个工具吗?这在两个不同的笔记本电脑之间有效吗?似乎是这样
%%cache mycache.pkl var1 var2
var1 = 1
var2 = 2
%cache myVar = someSlowCalculation(some, "parameters")