我想要做的就是序列化和反序列化字符串或整数元组.
我查看了pickle.dumps(),但字节开销很大.基本上它看起来占用了大约4倍的空间.此外,我需要的只是基本类型,不需要序列化对象.
marshal在空间方面稍好一些,但结果却充满了令人讨厌的\ x00字节.理想情况下,我希望结果是人类可读的.
我想过只使用repr()和eval(),但是有一种简单的方法可以在不使用eval()的情况下实现这一点吗?
这将存储在数据库中,而不是文件中.字节开销很重要,因为它可以在需要TEXT列和varchar之间产生差异,通常数据紧凑性会影响db性能的所有区域.
看一下json,至少生成的dumps
是可读的许多其他语言.
JSON(JavaScript Object Notation)http://json.org是用作轻量级数据交换格式的JavaScript语法(ECMA-262第3版)的子集.
我个人会用yaml.它与json的编码大小相同,但它可以在必要时代表一些更复杂的东西(例如类,递归结构).
In [1]: import yaml In [2]: x = [1, 2, 3, 'pants'] In [3]: print(yaml.dump(x)) [1, 2, 3, pants] In [4]: y = yaml.load('[1, 2, 3, pants]') In [5]: y Out[5]: [1, 2, 3, 'pants']
也许你没有使用正确的协议:
>>> import pickle >>> a = range(1, 100) >>> len(pickle.dumps(a)) 492 >>> len(pickle.dumps(a, pickle.HIGHEST_PROTOCOL)) 206
请参阅pickle数据格式的文档.
如果您需要节省空间的解决方案,可以使用Google协议缓冲区.
协议缓冲区 - 编码
协议缓冲区 - Python教程