2016-06-19 12 views
6

Próbuję serializować tysiące obiektów, a niektóre z tych obiektów to obiekty lambda.koperek kontra różnica różnicy w pikselach

Ponieważ cPickle nie działa w lambdach, próbowałem używać dill. Jednak spadek prędkości obliczeniowej jest ponad 10 razy podczas rozpakowywania (lub undilling (?)). Patrząc przez źródło, wydaje się, że wewnętrznie może to być przyczyną spadku prędkości.

Czy jest dla mnie jeszcze jedna opcja, która łączy w sobie to, co najlepsze z obu modułów?

EDYCJA: Najbardziej znaczący spadek prędkości podczas rozpakowywania.

+0

wyboru [ta odpowiedź] (http://stackoverflow.com/a/16626757/5741205) – MaxU

+0

Problem, jak stwierdziłem w moim pytaniem jest to, że 'dill' jest zbyt powolny w porównaniu do cPickle. – Tohiko

+0

"Obiekty serializowane w PIBCloud mogą zostać zdekazalizowane przy użyciu normalnych funkcji ładowania i ładowania pick_/cPickle._", więc pomyślałem, że może ci to pomóc, jeśli twój stosunek "serializacja/desiralizacja" jest "<< 1" – MaxU

Odpowiedz

14

Jestem autorem dill. Tak, dill jest zazwyczaj wolniejsza, ale jest to kara za bardziej solidną serializację. Jeśli serializujesz wiele klas i funkcji, możesz wypróbować jeden z wariantów dill w Jeśli użyjesz byref=True, wówczas dill zbierze kilka obiektów przez odniesienie (co jest szybsze niż domyślne). Inne ustawienia wymuszają wybieranie prędkości w wybranych obiektach.

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

Hi @Mike McKerns, kiedy zacząłem używać 'dill', to było dla tych niestandardowych klas' Python', które stworzyłem z wieloma skomplikowanymi typami danych i działały idealnie (gdy 'pickle' nie). Używam 'dill' od tego czasu, ale zastanawiam się, jakie typy typów danych mogę użyć' pickle', aby się nie zepsuć? To może być poza zakresem komentarza, ale czuję, że byłbyś ekspertem, skoro zrobiłeś "koper" z jakiegoś powodu. –

+2

Zobacz https://github.com/uqfoundation/dill/blob/master/dill/_objects.py. Staram się śledzić to, co można marynować, a czego nie (za pomocą "koperku" i/lub "marynaty"). Istnieje również powiązany test dla tego pliku. Teraz, umieszczenie ich w klasach ... to jest trochę bardziej nieprzetestowane. –