pickle模块似乎在酸洗时使用字符串转义字符; 这在numpy数组上变得低效.考虑以下
z = numpy.zeros(1000, numpy.uint8) len(z.dumps()) len(cPickle.dumps(z.dumps()))
长度分别为1133个字符和4249个字符.
z.dumps()显示类似"\ x00\x00"(字符串中的实际零),但pickle似乎使用字符串的repr()函数,产生"'\ x00\x00'"(零为ascii零).
ie(z.dumps()中的"0"== False)和(cPickle.dumps中的"0"(z.dumps())== True)
尝试使用更新版本的pickle协议和protocol参数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