diff options
| author | Gaëtan de Menten <gdementen@gmail.com> | 2009-11-03 15:52:57 +0000 |
|---|---|---|
| committer | Gaëtan de Menten <gdementen@gmail.com> | 2009-11-03 15:52:57 +0000 |
| commit | adaecccda17d927462df30f7e6be37a300798013 (patch) | |
| tree | 7c071c3826cbc5c7f459b6240f303443813859f9 /lib/sqlalchemy | |
| parent | db3521823dd629d07079555341b5f5885264650f (diff) | |
| download | sqlalchemy-adaecccda17d927462df30f7e6be37a300798013.tar.gz | |
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.
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/types.py | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/lib/sqlalchemy/types.py b/lib/sqlalchemy/types.py index c60f214f9..8643f3066 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: |
