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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了msgpack可以提供更好的性能和相同的python的struct.pack()功能吗?相关的知识,希望对你有一定的参考价值。

这个post比较了许多序列化例程,并指出msgpack比Python的struct.pack()和unpack()例程更快。我想使用msgpack,但无法弄清楚如何使用msgpack.packb()作为浮点数或双打,与struct.pack()等效。

我需要通过udp从python发送N双打到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'x9ax99x99x99x99x99xf1?x9ax99x99x99x99x99x01@ffffff
@'

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

msgPackedData = msgpack.packb(myTuple)

和print(msgPackedData)产生:

b'x93xcb?xf1x99x99x99x99x99x9axcb@x01x99x99x99x99x99x9axcb@
ffffff'

产出显然不一样。使用struct.pack()发送的数据包完全由udp监听器正确解释,但我想获得msgpack的性能改进。

可以在生成与struct.pack()相同的输出时获得msgpack的性能吗?

答案

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

上排是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格式表示双号的唯一方法。

以上是关于msgpack可以提供更好的性能和相同的python的struct.pack()功能吗?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas msgpack vs 泡菜

MsgPack/Json性能数据

我可以通过它来代替 ATL 的使用以获得相同或更好的性能?

相同配置的centos桌面和windows桌面,哪个更流畅,性能更好?

哪个蜂巢表提供更好的性能?

[.NET 开源] 高性能的 Swifter.MessagePack 已发布,并附带新版本的 Swifter.Json 和 Swifter.Data。