我的对象如下:
class Note(object):
def __init__(self, note, vel, t, tOff=0):
self.note = note # ubyte
self.vel = vel # ubyte
self.t = t # float
self.tOff = tOff # float
(类型指示显示每个字段所需的精度,而不是Python实际存储它们的方式!)
我的程序构造了一个可能有几千个Note-s的数组。
我需要将此数组转换为字符串,以便我可以将其AJAX到服务器进行存储(然后检索并转换回原始数据结构)。
我正在使用Brython来实现Python的JSON库(我已经测试过:import json
正常工作。所以我怀疑JSON是我最好的选择。
但是Brython并不是一个完整的CPython实现,所以我可能无法导入非核心库。看起来好像我不能做任何像使用插槽来制作高效存储类的东西。 (Brython将Python构造映射到适当的JavaScript构造上)。
理论上我应该能够将每个音符降低到10个字节,但我的目标是精益代码提供合理紧凑的存储而不是最终的紧凑性。然而,我想避免大量的低效率,例如将每个音符存储为键值对 - 即键将被复制。
如果我能看到可用的解决方案范围,我可以选择适当的复杂性与紧凑性权衡。也就是说,我会很感激连续统一体的答案。
答案 0 :(得分:1)
使用struct
的快速测试似乎为您提供了12个字节的可能长度,如下所示:
import struct
class Note(object):
def __init__(self, note, vel, t, tOff=0):
self.note = note # ubyte
self.vel = vel # ubyte
self.t = t # float
self.tOff = tOff # float
def pack(self):
return struct.pack("BBff", self.note, self.vel, self.t, self.tOff)
def unpack(self, packed):
self.note, self.vel, self.t, self.tOff = struct.unpack("BBff", packed)
note = Note(10, 250, 2.9394286605624826e+32, 1.46971433028e+32)
packed = note.pack()
print "Packed length:", len(packed)
note2 = Note(0,0,0)
note2.unpack(packed)
print note2.note, note2.vel, note2.t, note2.tOff
显示:
Packed length: 12
10 250 2.93942866056e+32 1.46971433028e+32
您可以根据所需的浮动类型进一步压缩它,即可能是某种固定点吗?
要打包notes
列表,可以使用以下内容:
notes = [1,2,3,4,5,6,7,8,9,10]
print struct.pack("{}B".format(len(notes)), *notes)
但是解包需要长度相同。或者你可以添加一个长度字节来帮助解压缩:
notes = [1,2,3,4,5,6,7,8,9,10]
packed = struct.pack("B{}B".format(len(notes)), len(notes), *notes)
length = struct.unpack("B", packed[0])[0]
print struct.unpack("{}B".format(length), packed[1:])
这将显示正确解压缩的数据:
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)