Укроп против разницы в скорости
Я пытаюсь сериализовать тысячи объектов, и некоторые из этих объектов являются лямбда-объектами.
поскольку 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]: