Как ускорить десериализацию protobuf из Python

#python #protocol-buffers

Вопрос:

Спецификация: protobuf ==реализация 3.17.2 C , python 3.7. В основном у меня есть список сегментов, которые были сериализованы с помощью protobuf на стороне java. и я хочу десериализовать его из python. Вот мой метод десериализации:

 def deserialize(self, proto) -> list:
        any = Any()
        full_segments = FullSegmentCacheEntries()
        any.ParseFromString(proto)
        any.Unpack(full_segments)

        return [SegmentEntity(
            _id=x.segment.id,
            names=x.segment.names,
            refs=x.segment.refs,
            nodes={"first": x.segment.nodes.first, "second": x.segment.nodes.second},
            osmIds=x.segment.osm_ids,
            line=self._deserialize_linestring(x.segment.line),
            lanes=x.segment.lanes,
            maxSpd=x.segment.max_spd,
            oneWay=x.segment.one_way,
            length=x.segment.length,
            nearStart=x.segment.near_start,
            nearEnd=x.segment.near_end,
            roadTypes=x.segment.road_types,
            direction=None if x.segment.direction is EMPTY_STRING else x.segment.direction,
            milemarkers=self._deserialize_milemarkers(x.segment.mile_markers),
            heading=x.segment.heading,
            sensors=x.segment.sensors,
            middlePoint={"type": "Point", "coordinates": [x.segment.middle_point.long, x.segment.middle_point.lat]},
            roadLevelTypes=x.segment.road_level_types,
            state=None if x.segment.state is EMPTY_STRING else x.segment.state,
            county=None if x.segment.county is EMPTY_STRING else x.segment.county,
            city=None if x.segment.city is EMPTY_STRING else x.segment.city,
            bridge=x.segment.bridge,
            generatedAt=utc_datetime_from_timestamp(x.segment.generated_at),
            alias=None if x.segment.alias is EMPTY_STRING else x.segment.alias

        ) for x in full_segments.entries]
 

В среднем это занимает около 0,5 мс, а в java-0,088 мс. Есть какие-нибудь советы, как это ускорить?

Ответ №1:

Вы можете попробовать использовать модуль маршала. Он используется компилятором байтов и намного быстрее. Но имейте в виду, что использование этого формата не является стабильным.

Комментарии:

1. попробуйте ускорить его без каких-либо побочных изменений. Может быть, я смогу ускорить работу с библиотекой protobuf