【问题标题】:What are the different use cases of joblib versus pickle?joblib 与 pickle 的不同用例是什么?
【发布时间】:2012-09-18 21:26:25
【问题描述】:

背景:我刚刚开始使用 scikit-learn,并在页面底部阅读了有关 joblib, versus pickle 的信息。

使用joblib的pickle替换(joblib.dump & joblib.load)可能更有趣,这在大数据上效率更高,但只能pickle到磁盘而不是字符串

我在 Pickle 上阅读了这个问答, Common use-cases for pickle in Python 想知道这里的社区是否可以分享 joblib 和 pickle 之间的区别?什么时候应该使用一个而不是另一个?

【问题讨论】:

    标签: python pickle scikit-learn


    【解决方案1】:
    • joblib 在大型 numpy 数组上通常要快得多,因为它对 numpy 数据结构的数组缓冲区进行了特殊处理。要了解实施细节,您可以查看source code。它还可以在使用 zlib 或 lz4 进行酸洗时即时压缩该数据。
    • joblib 还可以在加载时对未压缩的 joblib-pickled numpy 数组的数据缓冲区进行内存映射,从而可以在进程之间共享内存。
    • 如果你不腌制大型 numpy 数组,那么常规腌制可以明显更快,尤其是在小型 python 对象的大型集合上(例如 str 对象的大字典),因为标准库的 pickle 模块用 C 实现,而 joblib 是纯 python。
    • 自从 PEP 574(Pickle 协议 5)在 Python 3.8 中合并后,现在使用标准库腌制大型 numpy 数组的效率要高得多(内存方面和 cpu 方面)。在这种情况下,大型数组意味着 4GB 或更多。
    • 但是 joblib 仍然可以用于 Python 3.8,以使用 mmap_mode="r" 在内存映射模式下加载具有嵌套 numpy 数组的对象。

    【讨论】:

    • 非常感谢!这很有帮助。
    • 这是否意味着我们应该使用Joblib 而不是Pickle?我们应该考虑Joblib 的任何缺点?我最近刚刚听说了Joblib,我觉得这很有趣。
    • 我已经用标准库中的缺点和新东西更新了我的答案。
    • joblib 在反解析时是否也执行任意代码? (不安全)
    • 这很难通读所有的“注意...”并得到一行总结:joblib 在 3.8 中写入大型 numpy 数组的速度要快 X 倍,大致是什么X?并阅读?并且 pickle 在编写大量小型 Python 对象时大约快 Y 倍,Y 是多少?并阅读? 另外,相对压缩率/文件大小是多少?
    【解决方案2】:

    感谢 Gunjan 给我们这个脚本!我为 Python3 结果修改了它

    #comapare pickle loaders
    from time import time
    import pickle
    import os
    import _pickle as cPickle
    from sklearn.externals import joblib
    
    file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'database.clf')
    t1 = time()
    lis = []
    d = pickle.load(open(file,"rb"))
    print("time for loading file size with pickle", os.path.getsize(file),"KB =>", time()-t1)
    
    t1 = time()
    cPickle.load(open(file,"rb"))
    print("time for loading file size with cpickle", os.path.getsize(file),"KB =>", time()-t1)
    
    t1 = time()
    joblib.load(file)
    print("time for loading file size joblib", os.path.getsize(file),"KB =>", time()-t1)
    
    time for loading file size with pickle 79708 KB => 0.16768312454223633
    time for loading file size with cpickle 79708 KB => 0.0002372264862060547
    time for loading file size joblib 79708 KB => 0.0006849765777587891
    

    【讨论】:

    • Gunjan 使用了 1154320653 KB 的 pickle 文件。更大的文件会对 joblib 产生影响吗?
    • 请务必在显示性能数据时说明您的 Python 版本。 2.6? 2.7? 3.6? 3.7?更好的是,报告相对数字 joblib vs pickle vs cPickle。另外,修复 Gunjan 的错误是 1.1 GB 而不是 1.1 TB
    • 只是一些问题:(1) 需要lis = [] 行吗? (2)如何复制代码?也就是我们应该如何构造database文件呢?谢谢。
    【解决方案3】:

    我遇到了同样的问题,所以我尝试了这个(使用 Python 2.7),因为我需要加载一个大的泡菜文件

    #comapare pickle loaders
    from time import time
    import pickle
    import os
    try:
       import cPickle
    except:
       print "Cannot import cPickle"
    import joblib
    
    t1 = time()
    lis = []
    d = pickle.load(open("classi.pickle","r"))
    print "time for loading file size with pickle", os.path.getsize("classi.pickle"),"KB =>", time()-t1
    
    t1 = time()
    cPickle.load(open("classi.pickle","r"))
    print "time for loading file size with cpickle", os.path.getsize("classi.pickle"),"KB =>", time()-t1
    
    t1 = time()
    joblib.load("classi.pickle")
    print "time for loading file size joblib", os.path.getsize("classi.pickle"),"KB =>", time()-t1
    

    输出是

    time for loading file size with pickle 1154320653 KB => 6.75876188278
    time for loading file size with cpickle 1154320653 KB => 52.6876490116
    time for loading file size joblib 1154320653 KB => 6.27503800392
    

    根据这个 joblib 比这 3 个模块中的 cPickle 和 Pickle 模块工作得更好。谢谢

    【讨论】:

    • 我认为 cpickle 应该比 pickle 快?
    • 这个基准测试是否使用 python 3 完成,默认情况下使用 pickle(protocol=3)(比 python2 中的默认值更快)?
    • os.path.getsize 返回字节而不是千字节,所以我们谈论的是大约 1.1 GB 的文件(而不是输出中看起来的 1.1 TB)
    • 这很好,但请修正输出以反映它是 1.1 GB 而不是 1.1 TB。对于 Python 版本 3.6、3.7、3.8 和 2.7,对于 joblib、pickle 和 cPickle,最好绘制 10 次方的文件大小从 1KB...10GB 的比较数字。
    【解决方案4】:

    只是一个不起眼的笔记...... Pickle 更适合拟合的 scikit-learn 估计器/训练模型。在 ML 应用程序中,经过训练的模型被保存并重新加载,主要用于预测。

    【讨论】:

    • 这不能回答 OP 的问题。这更适合作为评论。
    • 为什么在这种情况下泡菜更好?
    猜你喜欢
    • 2019-07-29
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2016-02-12
    相关资源
    最近更新 更多