0

我的对象如下所示:

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 到服务器进行存储(随后检索并转换回原始数据结构)。

我正在使用实现 Python 的 JSON 库的Brythonimport json (我已经测试过:有效。所以我怀疑 JSON 是我最好的选择。

但是 Brython 不是一个完整的 CPython 实现,所以我可能无法导入非核心库。看起来我不能做任何花哨的事情,比如使用插槽来创建一个存储效率高的类。(Brython 将 Python 结构映射到适当的 JavaScript 结构上)。

从理论上讲,我应该能够将每个音符减少到 10 个字节,但我的目标是提供合理紧凑的存储而不是最终紧凑性的精简代码。然而,我想避免大量的低效率,例如将每个音符存储为键值对——即键将被复制。

如果我能看到可供我使用的解决方案的范围,我可以选择适当的复杂性与紧凑性权衡。也就是说,我将不胜感激在连续统一体的任何地方都能得到答案。

4

1 回答 1

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)
于 2015-08-25T17:20:52.280 回答