From 55dae1870bfcc9e2fb8f6f9f27aea6815e998fbe Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 26 May 2007 17:33:53 +0000 Subject: [PATCH] further minute speedups --- lib/sqlalchemy/orm/attributes.py | 10 ++-- lib/sqlalchemy/orm/mapper.py | 93 ++++++++++++-------------------- lib/sqlalchemy/orm/strategies.py | 6 +-- test/perf/masseagerload.py | 4 +- 4 files changed, 43 insertions(+), 70 deletions(-) diff --git a/lib/sqlalchemy/orm/attributes.py b/lib/sqlalchemy/orm/attributes.py index edcd7756bb..f64360766f 100644 --- a/lib/sqlalchemy/orm/attributes.py +++ b/lib/sqlalchemy/orm/attributes.py @@ -154,7 +154,7 @@ class InstrumentedAttribute(object): pass def _get_callable(self, obj): - if obj._state.has_key(('callable', self)): + if ('callable', self) in obj._state: return obj._state[('callable', self)] elif self.callable_ is not None: return self.callable_(obj) @@ -220,7 +220,7 @@ class InstrumentedAttribute(object): state = obj._state # if an instance-wide "trigger" was set, call that # and start again - if state.has_key('trigger'): + if 'trigger' in state: trig = state['trigger'] del state['trigger'] trig() @@ -259,7 +259,7 @@ class InstrumentedAttribute(object): if event is not self: state = obj._state # if an instance-wide "trigger" was set, call that - if state.has_key('trigger'): + if 'trigger' in state: trig = state['trigger'] del state['trigger'] trig() @@ -680,7 +680,7 @@ class CommittedState(object): """ if value is CommittedState.NO_VALUE: - if obj.__dict__.has_key(attr.key): + if attr.key in obj.__dict__: value = obj.__dict__[attr.key] if value is not CommittedState.NO_VALUE: self.data[attr.key] = attr.copy(value) @@ -928,7 +928,7 @@ class AttributeManager(object): by ``trigger_history()``. """ - return obj._state.has_key('trigger') + return 'trigger' in obj._state def reset_instance_attribute(self, obj, key): """Remove any per-instance callable functions corresponding to diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index 1017c3def4..25e78b7fe5 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -1472,7 +1472,7 @@ class Mapper(object): if self.__should_log_debug: self.__log_debug("_instance(): identity key %s not in session" % str(identitykey)) # look in result-local identitymap for it. - exists = context.identity_map.has_key(identitykey) + exists = identitykey in context.identity_map if not exists: if self.allow_null_pks: # check if *all* primary key cols in the result are None - this indicates @@ -1505,9 +1505,10 @@ class Mapper(object): # call further mapper properties on the row, to pull further # instances from the row and possibly populate this item. - if extension.populate_instance(self, context, row, instance, **{'instancekey':identitykey, 'isnew':isnew}) is EXT_PASS: - self.populate_instance(context, instance, row, **{'instancekey':identitykey, 'isnew':isnew}) - if extension.append_result(self, context, row, instance, result, **{'instancekey':identitykey, 'isnew':isnew}) is EXT_PASS: + flags = {'instancekey':identitykey, 'isnew':isnew} + if extension.populate_instance(self, context, row, instance, **flags) is EXT_PASS: + self.populate_instance(context, instance, row, **flags) + if extension.append_result(self, context, row, instance, result, **flags) is EXT_PASS: if result is not None: result.append(instance) return instance @@ -1799,7 +1800,7 @@ class _ExtensionCarrier(MapperExtension): def __iter__(self): return iter(self.__elements) - + def insert(self, extension): """Insert a MapperExtension at the beginning of this ExtensionCarrier's list.""" @@ -1809,62 +1810,34 @@ class _ExtensionCarrier(MapperExtension): """Append a MapperExtension at the end of this ExtensionCarrier's list.""" self.__elements.append(extension) + + def _create_do(funcname): + def _do(self, *args, **kwargs): + for elem in self.__elements: + ret = getattr(elem, funcname)(*args, **kwargs) + if ret is not EXT_PASS: + return ret + else: + return EXT_PASS + return _do + + get_session = _create_do('get_session') + load = _create_do('load') + get = _create_do('get') + get_by = _create_do('get_by') + select_by = _create_do('select_by') + select = _create_do('select') + translate_row = _create_do('translate_row') + create_instance = _create_do('create_instance') + append_result = _create_do('append_result') + populate_instance = _create_do('populate_instance') + before_insert = _create_do('before_insert') + before_update = _create_do('before_update') + after_update = _create_do('after_update') + after_insert = _create_do('after_insert') + before_delete = _create_do('before_delete') + after_delete = _create_do('after_delete') - def get_session(self, *args, **kwargs): - return self._do('get_session', *args, **kwargs) - - def load(self, *args, **kwargs): - return self._do('load', *args, **kwargs) - - def get(self, *args, **kwargs): - return self._do('get', *args, **kwargs) - - def get_by(self, *args, **kwargs): - return self._do('get_by', *args, **kwargs) - - def select_by(self, *args, **kwargs): - return self._do('select_by', *args, **kwargs) - - def select(self, *args, **kwargs): - return self._do('select', *args, **kwargs) - - def translate_row(self, *args, **kwargs): - return self._do('translate_row', *args, **kwargs) - - def create_instance(self, *args, **kwargs): - return self._do('create_instance', *args, **kwargs) - - def append_result(self, *args, **kwargs): - return self._do('append_result', *args, **kwargs) - - def populate_instance(self, *args, **kwargs): - return self._do('populate_instance', *args, **kwargs) - - def before_insert(self, *args, **kwargs): - return self._do('before_insert', *args, **kwargs) - - def before_update(self, *args, **kwargs): - return self._do('before_update', *args, **kwargs) - - def after_update(self, *args, **kwargs): - return self._do('after_update', *args, **kwargs) - - def after_insert(self, *args, **kwargs): - return self._do('after_insert', *args, **kwargs) - - def before_delete(self, *args, **kwargs): - return self._do('before_delete', *args, **kwargs) - - def after_delete(self, *args, **kwargs): - return self._do('after_delete', *args, **kwargs) - - def _do(self, funcname, *args, **kwargs): - for elem in self.__elements: - ret = getattr(elem, funcname)(*args, **kwargs) - if ret is not EXT_PASS: - return ret - else: - return EXT_PASS class ExtensionOption(MapperOption): def __init__(self, ext): diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py index d15d29a228..95cd1b8878 100644 --- a/lib/sqlalchemy/orm/strategies.py +++ b/lib/sqlalchemy/orm/strategies.py @@ -494,11 +494,11 @@ class EagerLoader(AbstractRelationLoader): def __init__(self, row): self.row = row def __contains__(self, key): - return self.has_key(key) + return key in map or key in self.row def has_key(self, key): - return map.has_key(key) or self.row.has_key(key) + return key in self def __getitem__(self, key): - if map.has_key(key): + if key in map: key = map[key] return self.row[key] def keys(self): diff --git a/test/perf/masseagerload.py b/test/perf/masseagerload.py index 2869fc6f7d..23b4c5ba1b 100644 --- a/test/perf/masseagerload.py +++ b/test/perf/masseagerload.py @@ -8,8 +8,8 @@ import time db = testbase.db -NUM = 500 -DIVISOR = 50 +NUM = 25000 +DIVISOR = 500 class LoadTest(AssertMixin): def setUpAll(self): -- 2.47.3