2013-12-20 3 views
1

Python 응용 프로그램에서 Google Protobuf를 사용하고 있습니다. protobufs를 실험 해본 결과, Protobuf Message Creation은 Python 기반 Python 구현과 비교하여 CPP 기반 Python 구현에서 훨씬 느리다는 것을 알게되었습니다.Google Protobuf의 C++ 기반 Python 구현 성능

PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION = cpp를 사용한 메시지 작성은 순수한 Python 기반 Protobuf 메시지 작성과 비교하여 2-3 배 정도 느립니다.

예상 되나요? serializeToString과 ParseFromString 둘 다 cpp verison에서 더 빠르다는 것을 알게되었습니다. 메시지의 크기가 커질수록 각 경우의 차이가 커집니다.

저는 이러한 작업을하기 위해 파이썬의 표준 timeit 모듈을 사용하고 있습니다. (구글 protobuf의 버전 2.4.1을 사용하여)

답변

2

그래, 난이 예상된다 생각합니다. pure-Python 구현은 dict의 모든 필드를 저장합니다. 새 메시지를 만들려면 기본적으로 빈 dict를 만듭니다. 이것은 매우 빠릅니다. C++ 구현은 실제로 후드 아래에있는 C++ DynamicMessage 객체를 초기화 한 다음 랩핑합니다. DynamicMessage은 실제로 모든 필드를 초기화합니다. 따라서 C++로 구현되었지만 "느리게"처리됩니다. 그러나이 초기 설정으로 인해 나중에 작업이 빨라집니다.

protobuf 오브젝트의 C++ 버전을 컴파일하고 다른 확장자로로드하여 성능을 향상시킬 수 있다고 생각합니다. 올바르게 기억한다면 C++에서 지원하는 Python protobuf 구현은 DynamicMessage이 아닌 컴파일 된 버전을 자동으로 사용합니다.

+0

어떻게 그 방법에 관한 문서가 있습니까? --cpp_out 메서드를 사용하여 protobuf 객체를 컴파일했지만 파이썬 응용 프로그램에서 이것을 "다른 확장"으로 사용하려면 어떻게해야합니까? – AnkurVj

+0

발견 http://yz.mit.edu/wp/fast-native-c-protocol-buffers-from-python/ 여기에서 지적한 내용이 다소 자세히 설명됩니다. 감사! – AnkurVj

+0

예상대로 실제로 작동하지는 않지만. 내 .proto 파일의 cpp 구현을 빌드하고 사용할 수 없습니다. – AnkurVj