2016-06-19 2 views
6

수천 개의 개체를 직렬화하려고하는데 이러한 개체 중 일부는 람다 ​​개체입니다.dill 대 cPickle 속도 차이

람다에서는 cPickle이 작동하지 않으므로 dill을 사용해 보았습니다. 그러나 계산 속도가 떨어지는 것은 unpickleing (또는 undilling (?))을 할 때 10 배가 넘습니다. 출처를 살펴보면 dill은 내부적으로 pickle을 사용하여 속도 저하의 원인이 될 수 있습니다.

두 가지 모듈의 장점을 결합하는 또 다른 옵션이 있습니까?

EDIT : 가장 중요한 속도 저하는 unpickleing 중입니다.

+0

체크 [이 답변] (http://stackoverflow.com/a/16626757/5741205) – MaxU

+0

문제, dill'가의 cPickle에 비해 너무 느려'이다. – Tohiko

+0

"_PiCloud 직렬화 된 객체는 일반 pickle/cPickle로드 및로드 함수를 사용하여 직렬화 해제 될 수 있습니다."그래서 직렬화/탈염 화 비율이 <<< 1 인 경우 도움이 될 수 있다고 생각합니다. – MaxU

답변

14

저는 dill입니다. 예, dill은 일반적으로 속도가 느리지 만보다 강력한 직렬화에 대한 대가로 지불해야합니다. 많은 클래스와 함수를 직렬화하는 경우 dill.settingsdill 변형 중 하나를 사용하려고 할 수 있습니다. 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]: 
+1

안녕하세요 @ 마이크 McKerns, 내가 '딜 (dill)'을 사용하기 시작했을 때, 나는 많은 복잡한 데이터 유형을 내부에 가지고 있고 (피클하지 않았을 때) 완벽하게 작동했다는 것을 인스턴스화 한 이러한 맞춤 파이썬 클래스에 대한 것이 었습니다. 나는 그때부터'dill'을 사용 해왔지만, 어떤 종류의 데이터 타입을 사용할 수 있을지에 대해서는'pickle'을 사용할 수 있을지 궁금합니다. 이것은 논평의 범위에서 벗어나지 만, 당신이 이유 때문에 '딜 (dill)'을 만들었 기 때문에 당신이 전문가가 될 것처럼 느껴집니다. –

+2

https://github.com/uqfoundation/dill/blob/master/dill/_objects.py를보십시오. 절임 될 수있는 것과 먹을 수없는 것 ('딜 (dill)'및/또는 '피클 (pickle)')을 추적하는 것이 최선의 노력입니다. 이 파일에 대한 관련 테스트도 있습니다. 이제 그들을 클래스에 넣으십시오 ... 조금 더 테스트되지 않았습니다. –