IT Share you

파이썬 피클 프로토콜 선택?

shareyou 2021. 1. 8. 21:46
반응형

파이썬 피클 프로토콜 선택?


나는 파이썬 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.6MB
  • prot0: 177.6MB
  • prot1: 44.4MB
  • prot2: 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'파일 모드 로 사용하십시오 !

cPicklepickle대부분 호환됩니다; 차이점은 제공되는 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

반응형