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