#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