Может ли msgpack обеспечить лучшую производительность и идентичную функциональность Python struct.pack ()? - PullRequest
0 голосов
/ 02 сентября 2018

Этот post сравнивает количество подпрограмм сериализации и указывает, что msgpack быстрее чем подпрограммы Python struct.pack() и unpack (). Я хотел бы использовать msgpack, но не могу понять, как использовать msgpack.packb() для чисел с плавающей запятой или двойников эквивалентным образом, как struct.pack().

Мне нужно отправить N удвоений через udp из python в C / C ++ слушатель, который читает N удваивается через udp / ip. Слушатель 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 (packData) дает:

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'

Выводы явно не совпадают. Пакеты, отправленные с помощью struct.pack (), правильно интерпретируются слушателем udp, но я бы хотел получить улучшение производительности msgpack.

Можно ли повысить производительность msgpack при получении идентичного вывода, как struct.pack()?

1 Ответ

0 голосов
/ 02 сентября 2018

Давайте сравним два упакованных бинарных файла.

Верхний ряд - 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

Следовательно, msgPackedData на 4 байта больше, чем packedData.

Другая разница между packedData и msgPackedData заключается в порядке байтов. Но это не влияет на размер.

Если вы не используете кортеж и просто упаковываете три двойных числа, тогда вы можете удалить сначала 0x93. Но нет способа удалить 0xcb. Это единственный способ выразить двойное число в формате MessagePack.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...