Pickle은 항상 특정 입력 값에 대해 동일한 출력을 생성합니까? 나는 동일한 내용을 가지고 있지만 삽입/삭제 기록이 다른 사전을 픽업 할 때 잡아 당김이있을 수 있다고 생각합니다. 필자의 목표는 Memoize 구현을 위해 Pickle과 SHA1을 사용하여 함수 인수의 "서명"을 만드는 것입니다.산세 공정이 결정적입니까?
7
A
답변
7
내용이 같지만 삽입/삭제 기록이 다른 사전을 픽업 할 때 문제가 있다고 생각합니다. 오른쪽
:
>>> pickle.dumps({1: 0, 9: 0}) == pickle.dumps({9: 0, 1: 0})
False
은 참조 : pickle.dumps not suitable for hashing
내 목표는 memoize 구현에 피클과 SHA1을 사용하여, 함수 인수의 "서명"을 만드는 것입니다.
여기에는 여러 가지 근본적인 문제가 있습니다. 그것은 평등 객체 정체성의 문제를 제대로-생각 매핑하는 객체를 문자열로 변환을 마련하는 것은 불가능하다 : 당신이 그들에 객체 계층 구조를 변환 할 수 있습니다
>>> a = object()
>>> b = object()
>>> a == b
False
>>> pickle.dumps(b) == pickle.dumps(a)
True
당신의 정확한 요구 사항에 따라 그 그런 다음 해시 수 있습니다 :
def hashablize(obj):
"""Convert a container hierarchy into one that can be hashed.
Don't use this with recursive structures!
Also, this won't be useful if you pass dictionaries with
keys that don't have a total order.
Actually, maybe you're best off not using this function at all."""
try:
hash(obj)
except TypeError:
if isinstance(obj, dict):
return tuple((k, hashablize(v)) for (k, v) in sorted(obj.iteritems()))
elif hasattr(obj, '__iter__'):
return tuple(hashablize(o) for o in obj)
else:
raise TypeError("Can't hashablize object of type %r" % type(obj))
else:
return obj
0
동일한 출력으로 무엇을 의미합니까? 일반적으로 왕복 (pickling -> unpickling)에 대해 항상 동일한 출력을 얻어야하지만 직렬화 된 형식 자체는 모든 조건에서 동일하게 보장되지 않는다고 생각합니다. 물론, 그것은 플랫폼과 모든 것 사이에서 바뀔 수 있습니다.
메모 링을 위해 산 울기를 사용하는 것이 좋을 것입니다. 문제없이이 구성표를 여러 번 사용했지만 아주 간단한 문제였습니다. 한 가지 문제는 모든 유용한 사례를 다루지는 않는다는 것입니다 (함수가 마음에 들었습니다 : 피클 할 수 없으므로 함수가 호출 가능한 인수를 사용하면 작동하지 않습니다).
관련 문제
- 1. 파이썬 산세 슬롯 오류
- 2. RemoteActor.select - 결과 결정적입니까?
- 3. .mpkg 내에 .pkg 설치 순서가 결정적입니까?
- 4. C++ 이름 변경 (장식)이 결정적입니까?
- 5. MAC 주소와 관련하여 UuidCreateSequential은 얼마나 결정적입니까?
- 6. MySQL 외래 키 자동 생성 이름이 결정적입니까?
- 7. C# 목록의 요소 순서가 결정적입니까? <T>?
- 8. CSS - serif와 sans-serif 글꼴 사이의 크기 차이를 처리하려면 어떻게해야합니까?
- 9. 이미 ajaxComboBox에 대한 JSON 반환 ASP.NET MVC가 있습니까?
- 10. C : 진술서는 무엇을 반환하겠습니까? 1 '은 A> 1 일 때 돌아온다.
- 11. 내 웹 사이트에서 Tahoma 글꼴을 사용하지 않는 이유는 무엇입니까?
- 12. 평범하지 않은 응용 프로그램에서 TDD는 어떻게합니까?
- 13. CSS '조각가'또는 비 통합?
- 14. Windows 7의 Firefox 3.5에서 텍스트가 엉망인 이유는 무엇입니까? (그림 참조) 어떻게 해결할 수 있습니까?
- 15. 글꼴면을 인쇄 할 화면
- 16. 텍스트 스타일 이탤릭체가 안드로이드 레이아웃에서 serif 이외의 다른 서체에 적용되지 않는 이유는 무엇입니까?
- 17. HTML 5 캔버스 글꼴이 무시됩니다.
- 18. 어떻게 플롯의 메인 타이틀의 글꼴을 변경하려면() 나는 온 <a href="http://www.harding.edu/fmccown/R/" rel="noreferrer">this page</a>에서
- 19. Zend Framework의 테이블, 행 집합 및 행 간의 관계?
- 20. 정적 이니셜 라이저 함수 사용
- 21. 안드로이드 앱 연장하기
- 22. 정상적인 기본 글꼴?
- 23. emacs에서 앤티 엘리 어싱 된 글꼴
- 24. DefaultModelBinder에 여러 접두사 추가 MVC2
- 25. 가 만들어집니다 다소 자주 (매월 정도) 새로운 "할 일"항목으로 텍스트를 변경하는 스티커 메모의 이미지가 웹 사이트에서 작업하는 "스티커 메모"텍스트
- 26. 사용자 별 매개 변수를 저장하는 방법 - 찾으려는 의견
- 27. 리눅스에서 웹 사이트를 똑같이 보이게 만드는 방법
- 28. Objective-C 블록을 serialize/unserialize 할 수있는 방법이 있습니까?
- 29. Linq가 데이터보기에 비해 매우 느린 개체
- 30. 자바 스크립트 팝업창