msgpack可以提供更好的性能和python的struct.pack()相同的功能吗?

时间:2018-09-02 00:03:56

标签: python c++ c udp msgpack

post比较了许多序列化例程,并表明msgpack比Python的struct.pack()和unpack()例程更快。我想使用msgpack,但无法弄清楚如何使用msgpack.packb()进行浮点或双打,其方式与struct.pack()相同。

我需要通过udp将N个双打从 python 发送到 C / C ++ 侦听器,该侦听器通过udp / ip读取N个双打。无法修改C / C ++侦听器。 Python struct.pack()方法的工作原理类似于此剪辑,用于打包N = 3双打:

import struct
import msgpack

packer = struct.Struct('ddd')
myTuple = (1.1, 2.2, 3.3)
packedData = packer.pack(*myTuple)

print(packedData)产生:

b'\x9a\x99\x99\x99\x99\x99\xf1?\x9a\x99\x99\x99\x99\x99\x01@ffffff\n@'

然后使用msgpack尝试相同的操作:

msgPackedData = msgpack.packb(myTuple)

和print(msgPackedData)产生:

b'\x93\xcb?\xf1\x99\x99\x99\x99\x99\x9a\xcb@\x01\x99\x99\x99\x99\x99\x9a\xcb@\nffffff'

输出显然不相同。 udp侦听器可以正确解释struct.pack()发送的数据包,但我想提高msgpack的性能。

在产生与struct.pack()相同的输出时,能否获得msgpack的性能?

1 个答案:

答案 0 :(得分:1)

让我们比较两个压缩的二进制文件。

上面一行是msgPackedData,下面一行是packedData

0x93 0xcb 0x3f 0xf1 0x99 0x99 0x99 0x99 0x99 0x9a 0xcb 0x40 0x01 0x99 0x99 0x99 0x99 0x99 0x9a 0xcb 0x40 0x0a 0x66 0x66 0x66 0x66 0x66 0x66 
          0x9a 0x99 0x99 0x99 0x99 0x99 0xf1 0x3f      0x9a 0x99 0x99 0x99 0x99 0x99 0x01 0x40      0x66 0x66 0x66 0x66 0x66 0x66 0x0a 0x40 

您可以看到第一个0x93和三个0xcb。这是什么?

MessagePack包含类型信息。

0x93表示由3个元素组成的数组。 https://github.com/msgpack/msgpack/blob/master/spec.md#array-format-family

0xcb表示大端   IEEE 754双精度浮点数https://github.com/msgpack/msgpack/blob/master/spec.md#float-format-family

因此,msgPackedDatapackedData大4个字节。

packedDatamsgPackedData之间的另一个区别是字节顺序。但这不会影响大小。

如果您不使用元组,只需打包三个双精度数字,则可以删除第一个0x93。但是没有办法删除0xcb。这是用MessagePack格式表示双数的唯一方法。