更有效的方法来挑选一个字符串

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)是二进制的,应该更加空间保守.


var*_*tec 8

解:

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)