From: Gaƫtan de Menten Date: Tue, 3 Nov 2009 15:52:57 +0000 (+0000) Subject: rewrote PickleType bind_processor and result_processors to bypass TypeDecorator X-Git-Tag: rel_0_6beta1~195 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=adaecccda17d927462df30f7e6be37a300798013;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git rewrote PickleType bind_processor and result_processors to bypass TypeDecorator call overhead and avoid pickler function lookup for each row (see #1598). Provides a speedup of ~7 % on total query time for a 1000 record query on a table with 1 PickeType field and 25% None values. --- diff --git a/lib/sqlalchemy/types.py b/lib/sqlalchemy/types.py index c60f214f9a..8643f3066c 100644 --- a/lib/sqlalchemy/types.py +++ b/lib/sqlalchemy/types.py @@ -1025,18 +1025,36 @@ class PickleType(MutableType, TypeDecorator): self.comparator = comparator super(PickleType, self).__init__() - def process_bind_param(self, value, dialect): - if value is None: - return None + def bind_processor(self, dialect): + impl_processor = self.impl.bind_processor(dialect) dumps = self.pickler.dumps protocol = self.protocol - return dumps(value, protocol) + if impl_processor: + def process(value): + if value is None: + return impl_processor(None) + return impl_processor(dumps(value, protocol)) + else: + def process(value): + if value is None: + return None + return dumps(value, protocol) + return process - def process_result_value(self, value, dialect): - if value is None: - return None + def result_processor(self, dialect): + impl_processor = self.impl.result_processor(dialect) loads = self.pickler.loads - return loads(value) + if impl_processor: + def process(value): + if value is None: + return impl_processor(None) + return loads(impl_processor(value)) + else: + def process(value): + if value is None: + return None + return loads(value) + return process def copy_value(self, value): if self.mutable: