【问题标题】:How to cache in IPython Notebook?如何在 IPython Notebook 中缓存?
【发布时间】:2015-09-24 04:37:47
【问题描述】:

环境:

  • Python 3
  • IPython 3.2

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

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

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

【问题讨论】:

  • 我不知道 Ipython 中是否有这样的功能,但您可以简单地将昂贵的计算缓存到磁盘上,例如 joblib.Memory

标签: python r ipython knitr ipython-notebook


【解决方案1】:

使用cache magic

%cache myVar = someSlowCalculation(some, "parameters")

这将计算 someSlowCalculation(some, "parameters") 一次。在随后的调用中,它会从存储中恢复 myVar。

https://pypi.org/project/ipython-cache/

在后台,它与公认的答案几乎相同。

【讨论】:

    【解决方案2】:

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

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

    就这么简单:

    %load_ext ipycache
    

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

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

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

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

    【讨论】:

    • 非常有用,比%autoreload 更容易为我工作(我在更改模块但不想重新加载数据的另一种方式)
    • ipycache 似乎需要很多的爱。大量警告,最后一次更新是 2016 年 5 月。
    • 该死,它曾经是低维护的:SI 猜测随着 python 版本的进步,事情会发生变化......仍然有一些美好的回忆,到目前为止我找到的最好的解决方案,会很高兴找到更好/更活跃的东西
    • %store有什么区别?
    • ipycache 不再维护,你知道另一个工具吗?
    【解决方案3】:

    你能举例说明你正在尝试做什么吗?当我在 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 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')
    

    【讨论】:

    • 我尝试将机器学习模型应用于数据集。例如,我通过 pandas 导入一些数据(几百 MB),然后通过 scikit-learn 训练和测试两个模型。我想“缓存”所有中间转换的 DataFrame,以及经过训练的模型。所以我可以在中间 DataFrame 上“进行”实验,而无需从地面读取。
    • @zelong 好的,你应该使用joblib 腌制你的sklearn 模型。请参阅我上面的编辑。并将您的数据帧写入磁盘只需使用dataframe.to_csv('yourfile.csv)
    • 非常感谢。 scikit-learn 模型的酸洗看起来相当不错。我尝试了很多与 DataFrames 的争论,似乎需要将一堆中间 DataFrame 保存到 csv 文件。但似乎 IPython 没有提供 RData 缓存的对应项,它将所有内容放在一个立方体中。
    • 我删除了file.close() 调用,因为with closes files for you
    • 另外:由于data 是一个“列表”,因此可以更简单地使用json.dump(data, file),而无需任何循环。同样json.load(file).
    【解决方案4】:

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

    在您的 Jupyter 笔记本中:

    a = 1
    %store a
    

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

    %store -r a
    print a # Should print 1
    

    【讨论】:

    • 这是否适用于两个不同的笔记本?好像是这样的
    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2014-02-27
    • 1970-01-01
    相关资源
    最近更新 更多