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"))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top