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

由于cPickle对lambda无效,因此我尝试使用dill。但是,不加针孔(或不加针孔(?))时,计算速度的下降超过10倍。查看源代码,看来dill在内部使用了pickle,这可能是速度下降的原因。

我是否还有另一种选择可以将两个模块的优点结合在一起?

编辑:最显着的速度下降是在脱皮期间。

最佳答案

我是dill的作者。是的,dill通常较慢,但这是您为更健壮的序列化付出的代价。如果要序列化很多类和函数,则可能需要尝试dill中的dill.settings变体之一。如果使用byref=True,则dill将通过引用来 pickle 多个对象(比默认值更快)。其他设置在可选择性上权衡了所选对象的速度。

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]:

关于python - dill vs cPickle速度差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37906154/

10-11 07:08