diff options
author | Alex Ausch <ausch@perpetualabs.com> | 2017-01-20 15:54:28 -0500 |
---|---|---|
committer | Alex Ausch <ausch@perpetualabs.com> | 2017-01-30 15:42:01 -0500 |
commit | 2c36cc30dd9e60f4172db6c55d552aebc692bea2 (patch) | |
tree | fc47423a4abab5ca21045500377f0e8b6404565a | |
parent | 047575f20cbdee8fb2f88d78a317ffe6133b93e6 (diff) | |
download | protobuf-2c36cc30dd9e60f4172db6c55d552aebc692bea2.tar.gz protobuf-2c36cc30dd9e60f4172db6c55d552aebc692bea2.tar.bz2 protobuf-2c36cc30dd9e60f4172db6c55d552aebc692bea2.zip |
cache generated classes, optimization and quick workaround to memory leak
-rwxr-xr-x | python/google/protobuf/reflection.py | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/python/google/protobuf/reflection.py b/python/google/protobuf/reflection.py index 51c83321..05bafd69 100755 --- a/python/google/protobuf/reflection.py +++ b/python/google/protobuf/reflection.py @@ -61,6 +61,8 @@ else: # Part of the public interface, but normally only used by message factories. GeneratedProtocolMessageType = message_impl.GeneratedProtocolMessageType +MESSAGE_CLASS_CACHE = {} + def ParseMessage(descriptor, byte_str): """Generate a new Message instance from this Descriptor and a byte string. @@ -104,11 +106,16 @@ def MakeClass(descriptor): Returns: The Message class object described by the descriptor. """ + if descriptor in MESSAGE_CLASS_CACHE: + return MESSAGE_CLASS_CACHE[descriptor] + attributes = {} for name, nested_type in descriptor.nested_types_by_name.items(): attributes[name] = MakeClass(nested_type) attributes[GeneratedProtocolMessageType._DESCRIPTOR_KEY] = descriptor - return GeneratedProtocolMessageType(str(descriptor.name), (message.Message,), + result = GeneratedProtocolMessageType(str(descriptor.name), (message.Message,), attributes) + MESSAGE_CLASS_CACHE[descriptor] = result + return result |