Укроп против разницы в скорости

Я пытаюсь сериализовать тысячи объектов, и некоторые из этих объектов являются лямбда-объектами.

поскольку cPickle не работает для лямбды, я пытался использовать dill, Тем не менее, падение скорости вычислений более чем в 10 раз при расслоении (или расшатывание (?)). Просматривая источник, кажется, что dill использования pickle внутренне, что может быть причиной падения скорости.

Есть ли другой вариант для меня, который сочетает в себе лучшее из обоих модулей?

РЕДАКТИРОВАТЬ: наиболее значительное падение скорости во время расслоения.

1 ответ

Решение

Я dill автор. Да, dill обычно медленнее, но вы платите за более надежную сериализацию. Если вы сериализуете много классов и функций, вы можете попробовать один из dill варианты в dill.settings Если вы используете byref=True затем dill выберет несколько объектов по ссылке (что быстрее, чем по умолчанию). Другие настройки компенсируют возможность выбора скорости для выбранных объектов.

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]: 
Другие вопросы по тегам