更有效的方式来腌制一个字符串
-
22-08-2019 - |
题
pickle模块似乎使用酸洗时字符串转义字符;这成为低效的例如在numpy的阵列。考虑以下
z = numpy.zeros(1000, numpy.uint8)
len(z.dumps())
len(cPickle.dumps(z.dumps()))
在长度分别为1133个字符和4249个字符。
z.dumps()揭示了类似的 “\ x00 \ x00的”(实际字符串零),但泡菜好像是用字符串的再版()函数,产生 “ '\ X00 \ X00'”(零为ASCII零)。
即。 ( “0” 在z.dumps()==假)和( “0” 在cPickle.dumps(z.dumps())== TRUE)
解决方案
尝试使用pickle协议的更高版本与所述协议参数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