Optimize calling of overridden providers

This commit is contained in:
Roman Mogilatov 2017-04-06 12:34:04 +03:00
parent 902cec5364
commit 1dacd096f6
5 changed files with 2359 additions and 2462 deletions

View File

@ -13,7 +13,7 @@ Development version
3.4.0
-----
- No features.
- Optimize calling of overridden providers (~15% faster).
3.3.7
-----

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -9,10 +9,9 @@ cimport cython
# Base providers
cdef class Provider(object):
cdef tuple __overridden
cdef int __overridden_len
cdef Provider __last_overriding
cpdef object _provide(self, tuple args, dict kwargs)
cpdef object _call_last_overriding(self, tuple args, dict kwargs)
cdef class Object(Provider):

View File

@ -83,7 +83,7 @@ cdef class Provider(object):
def __init__(self):
"""Initializer."""
self.__overridden = tuple()
self.__overridden_len = 0
self.__last_overriding = None
super(Provider, self).__init__()
def __call__(self, *args, **kwargs):
@ -91,8 +91,8 @@ cdef class Provider(object):
Callable interface implementation.
"""
if self.__overridden_len != 0:
return self._call_last_overriding(args, kwargs)
if self.__last_overriding is not None:
return self.__last_overriding._provide(args, kwargs)
return self._provide(args, kwargs)
def __deepcopy__(self, memo):
@ -146,12 +146,10 @@ cdef class Provider(object):
provider = Object(provider)
self.__overridden += (provider,)
self.__overridden_len += 1
self.__last_overriding = provider
return OverridingContext(self, provider)
@cython.boundscheck(False)
@cython.wraparound(False)
def reset_last_overriding(self):
"""Reset last overriding provider.
@ -160,11 +158,14 @@ cdef class Provider(object):
:rtype: None
"""
if self.__overridden_len == 0:
if len(self.__overridden) == 0:
raise Error('Provider {0} is not overridden'.format(str(self)))
self.__overridden = self.__overridden[:self.__overridden_len - 1]
self.__overridden_len -= 1
self.__overridden = self.__overridden[:-1]
try:
self.__last_overriding = self.__overridden[-1]
except IndexError:
self.__last_overriding = None
def reset_override(self):
"""Reset all overriding providers.
@ -172,7 +173,7 @@ cdef class Provider(object):
:rtype: None
"""
self.__overridden = tuple()
self.__overridden_len = 0
self.__last_overriding = None
def delegate(self):
"""Return provider's delegate.
@ -190,13 +191,6 @@ cdef class Provider(object):
"""
raise NotImplementedError()
@cython.boundscheck(False)
@cython.wraparound(False)
cpdef object _call_last_overriding(self, tuple args, dict kwargs):
"""Call last overriding provider and return result."""
return <object>self.__overridden[self.__overridden_len - 1](*args,
**kwargs)
cdef class Object(Provider):
"""Object provider returns provided instance "as is".
@ -332,10 +326,10 @@ cdef class ExternalDependency(Provider):
"""
cdef object instance
if self.__overridden_len == 0:
if self.__last_overriding is None:
raise Error('Dependency is not defined')
instance = self._call_last_overriding(args, kwargs)
instance = self.__last_overriding._provide(args, kwargs)
if not isinstance(instance, self.instance_of):
raise Error('{0} is not an '.format(instance) +