首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dill与cPickle速度差异

dill与cPickle速度差异
EN

Stack Overflow用户
提问于 2016-06-19 18:17:55
回答 1查看 13.3K关注 0票数 19

我正在尝试序列化数千个对象,其中一些是lambda对象。

由于cPickle不适用于lambda,所以我尝试使用dill。然而,当取消unpickleing (或取消计费(?))时,计算速度下降了10倍以上。通过查看源代码,似乎dill在内部使用了pickle,这可能是速度下降的原因。

对于我来说,有没有其他选择可以结合这两个模块的优点?

编辑:最显著的速度下降是在取消酸洗期间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-20 17:56:07

我是dill的作者。是的,dill通常比较慢,但这是你为更健壮的序列化付出的代价。如果您正在序列化大量的类和函数,那么您可能希望在dill.settings中尝试一个dill变体如果您使用byref=True,那么dill将通过引用来拾取几个对象(这比默认的更快)。其他设置会牺牲可拾取性来换取选定对象中的速度。

代码语言:javascript
复制
In [1]: import dill

In [2]: f = lambda x:x

In [3]: %timeit dill.loads(dill.dumps(f))
1000 loops, best of 3: 286 us per loop

In [4]: dill.settings['byref'] = True

In [5]: %timeit dill.loads(dill.dumps(f))
1000 loops, best of 3: 237 us per loop

In [6]: dill.settings
Out[6]: {'byref': True, 'fmode': 0, 'protocol': 2, 'recurse': False}

In [7]: dill.settings['recurse'] = True

In [8]: %timeit dill.loads(dill.dumps(f))
1000 loops, best of 3: 408 us per loop

In [9]: class Foo(object):
   ...:     x = 1
   ...:     def bar(self, y):
   ...:         return y + self.x
   ...:     

In [10]: g = Foo()

In [11]: %timeit dill.loads(dill.dumps(g))
10000 loops, best of 3: 87.6 us per loop

In [12]: dill.settings['recurse'] = False

In [13]: %timeit dill.loads(dill.dumps(g))
10000 loops, best of 3: 87.4 us per loop

In [14]: dill.settings['byref'] = False

In [15]: %timeit dill.loads(dill.dumps(g))
1000 loops, best of 3: 499 us per loop

In [16]: 
票数 43
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37906154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档