끈을 피우는보다 효율적인 방법
-
22-08-2019 - |
문제
피클 모듈은 산세 할 때 문자열 탈출 문자를 사용하는 것 같습니다. 이것은 비효율적 인 예를 들어 비효율적입니다. 다음을 고려하세요
z = numpy.zeros(1000, numpy.uint8)
len(z.dumps())
len(cPickle.dumps(z.dumps()))
길이는 각각 1133 자와 4249 자입니다.
z.dumps ()는 " x00 x00"(실제 0 인 String)과 같은 것을 드러내지 만 Pickle은 String의 repl () 함수를 사용하여 " ' x00 x00'"(0 인 ASCII Zeros)를 산출하는 것으로 보입니다.
ie (z.dumps () == false)의 "0"및 (cpickle.dumps (z.dumps ()) == true의 "0"
해결책
프로토콜 매개 변수와 함께 후기 버전의 피클 프로토콜을 사용해보십시오. pickle.dumps()
. 기본값은 0이고 ASCII 텍스트 형식입니다. 1보다 큰 것 (Pickle.highest_protocol을 사용하는 것이 좋습니다). 프로토콜 형식 1과 2 (및 3이지만 PY3K의 경우)는 이진이며 더 많은 공간 보수적이어야합니다.
다른 팁
해결책:
import zlib, cPickle
def zdumps(obj):
return zlib.compress(cPickle.dumps(obj,cPickle.HIGHEST_PROTOCOL),9)
def zloads(zstr):
return cPickle.loads(zlib.decompress(zstr))
>>> len(zdumps(z))
128
z.dumps()
이미 절인 문자열, 즉 Pickle.loads ()를 사용하여 꼬할 수 있습니다.
>>> z = numpy.zeros(1000, numpy.uint8)
>>> s = z.dumps()
>>> a = pickle.loads(s)
>>> all(a == z)
True
Vartec의 답변에 대한 개선은 조금 더 메모리 효율적으로 보입니다 (모든 것이 문자열로 강제되지 않기 때문에) :
def pickle(fname, obj):
import cPickle, gzip
cPickle.dump(obj=obj, file=gzip.open(fname, "wb", compresslevel=3), protocol=2)
def unpickle(fname):
import cPickle, gzip
return cPickle.load(gzip.open(fname, "rb"))
제휴하지 않습니다 StackOverflow