Msgpack能否提供更好的性能和与Python的struct.pack()相同的功能?

can msgpack provide better performance and identical functionality of python's struct.pack()?

本文关键字:pack struct 功能 Python 更好 性能 Msgpack      更新时间:2023-10-16

这篇文章比较了许多序列化例程,并指出msgpack比Python的struct.pack()和unpack((例程更快。我想使用 msgpack,但无法弄清楚如何以与struct.pack()相同的方式将msgpack.packb()用于浮点数或双精度数。

我需要通过 udp 从pythonC/C++侦听器发送 N 个双精度值,该侦听器通过 udp/ip 读取 N 个双精度值。无法修改 C/C++ 侦听器。Pythonstruct.pack()方法像这个剪辑一样工作得很好,用于打包 N=3 双精度:

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

打印(打包数据(产量:

b'x9ax99x99x99x99x99xf1?x9ax99x99x99x99x99x01@ffffffn@'

然后用msgpack尝试同样的事情:

msgPackedData = msgpack.packb(myTuple)

和打印(msgPackedData(产生:

b'x93xcb?xf1x99x99x99x99x99x9axcb@x01x99x99x99x99x99x9axcb@nffffff'

输出显然不一样。udp 侦听器完美地解释了使用 struct.pack(( 发送的数据包,但我想获得 msgpack 的性能改进。

可以在产生与struct.pack()相同的输出的同时获得味精包的性能吗?

让我们比较两个打包的二进制文件。

上排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。这是怎麽?

消息包包含类型信息。

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。这是以消息包格式表示双精度数的唯一方法。