파이썬 피클 프로토콜 선택?
나는 파이썬 2.7을 사용하고 객체를 피클하려고합니다. 피클 프로토콜의 실제 차이점이 무엇인지 궁금합니다.
import numpy as np
import pickle
class data(object):
def __init__(self):
self.a = np.zeros((100, 37000, 3), dtype=np.float32)
d = data()
print "data size: ", d.a.nbytes/1000000.
print "highest protocol: ", pickle.HIGHEST_PROTOCOL
pickle.dump(d,open("noProt", 'w'))
pickle.dump(d,open("prot0", 'w'), protocol=0)
pickle.dump(d,open("prot1", 'w'), protocol=1)
pickle.dump(d,open("prot2", 'w'), protocol=2)
out >> data size: 44.4
out >> highest protocol: 2
그런 다음 저장된 파일의 크기가 디스크에 다른 것을 발견했습니다.
noProt
: 177.6MBprot0
: 177.6MBprot1
: 44.4MBprot2
: 44.4MB
prot0
사람이 읽을 수있는 텍스트 파일 이라는 것을 알고 있으므로 사용하고 싶지 않습니다. 프로토콜 0이 기본적으로 제공되는 것 같습니다.
프로토콜 1과 2의 차이점이 무엇인지 궁금합니다. 둘 중 하나를 선택해야하는 이유가 있습니까?
어떤 것은 사용하는 것이 좋습니다, pickle
또는 cPickle
?
로부터 pickle
모듈 데이터 형식의 문서 :
현재 산세에 사용할 수있는 3 가지 프로토콜이 있습니다.
- 프로토콜 버전 0은 원래 ASCII 프로토콜이며 이전 버전의 Python과 역 호환됩니다.
- 프로토콜 버전 1은 이전 버전의 Python 과도 호환되는 이전 바이너리 형식입니다.
- 프로토콜 버전 2는 Python 2.3에서 도입되었습니다. 새로운 스타일의 클래스를 훨씬 더 효율적으로 피클 링 할 수 있습니다.
[...]
경우 프로토콜이 지정되지 않은 프로토콜 0이 사용됩니다. 프로토콜 이 음수 값 또는으로 지정 되면
HIGHEST_PROTOCOL
사용 가능한 가장 높은 프로토콜 버전이 사용됩니다.
특히object
(새 스타일 클래스) 에서 파생 된 사용자 정의 클래스를 사용하는 경우 프로토콜 버전 2 를 사용하십시오 . 요즘에는 가장 현대적인 코드가 수행합니다.
이전 Python 버전과의 하위 호환성을 유지해야하는 경우가 아니라면 손을 댈 수있는 가장 높은 프로토콜 버전을 사용하는 것이 가장 쉽습니다.
with open("prot2", 'wb') as pfile:
pickle.dump(d, pfile, protocol=pickle.HIGHEST_PROTOCOL)
바이너리 형식이므로 'wb'
파일 모드 로 사용하십시오 !
cPickle
와 pickle
대부분 호환됩니다; 차이점은 제공되는 API에 있습니다. 대부분의 사용 사례에서는 cPickle
; 더 빠릅니다. 문서를 다시 인용 :
첫째,
cPickle
전자가 C로 구현 되었기 때문에 피클보다 최대 1000 배 더 빠를 수 있습니다. 둘째,cPickle
모듈에서 클래스가 아닌 콜 러블Pickler()
이며Unpickler()
함수입니다. 즉, 사용자 지정 피클 링 및 언 피클 링 하위 클래스를 파생하는 데 사용할 수 없습니다. 대부분의 응용 프로그램에는이 기능이 필요하지 않으며cPickle
모듈의 성능이 크게 향상되어야 합니다.
Python 3을 사용하는 사람들을 위해 Python 3.5부터 선택할 수있는 5 가지 프로토콜이 있습니다.
There are currently 5 different protocols which can be used for pickling. The higher the protocol used, the more recent the version of Python needed to read the pickle produced [doc]:
Protocol version 0 is the original “human-readable” protocol and is backwards compatible with earlier versions of Python.
Protocol version 1 is an old binary format which is also compatible with earlier versions of Python.
- Protocol version 2 was introduced in Python 2.3. It provides much more efficient pickling of new-style classes. Refer to PEP 307 for information about improvements brought by protocol 2.
- Protocol version 3 was added in Python 3.0. It has explicit support for bytes objects and cannot be unpickled by Python 2.x. This is the default protocol, and the recommended protocol when compatibility with other Python 3 versions is required.
- Protocol version 4 was added in Python 3.4. It adds support for very large objects, pickling more kinds of objects, and some data format optimizations. Refer to PEP 3154 for information about improvements brought by protocol 4.
A general rule is that you should use the highest possible protocol that is backward compatible with what you want to use it for. So if you want it to be backward compatible with Python 2, then protocol version 2 is a good choice, if you want it to be backward compatible with all Python versions then version 1 is good. If you do not care about backward compatibility then using pickle.HIGHEST_PROTOCOL
automatically gives you the highest protocol for your Python version.
Also in Python 3, importing pickle
automatically imports the C implementation.
Another point to note in terms of compatibility is that, by default protocols 3 and 4 use unicode encoding of strings whereas earlier protocols do not. So in Python 3, if you load a pickled file which was pickled in Python 2, you will probably have to explicitly specify the encoding in order to load it properly.
ReferenceURL : https://stackoverflow.com/questions/23582489/python-pickle-protocol-choice
'IT Share you' 카테고리의 다른 글
AngularJS 지시문에 속성을 통해 배열 전달 (0) | 2021.01.08 |
---|---|
neo4j 데이터베이스를 재설정 / 삭제 / 삭제하는 방법은 무엇입니까? (0) | 2021.01.08 |
잘못된 개체 상태를 나타내는 기본 제공 .NET 예외가 있습니까? (0) | 2021.01.08 |
축 레이블 사용자 지정 (0) | 2021.01.08 |
장치 'emulator-5554'에 * .apk를 설치하지 못했습니다. EOF (0) | 2021.01.08 |