On Apr 30, 2013, at 6:26 PM, Claudio Freire <klaussfre...@gmail.com> wrote:

> On Fri, Apr 26, 2013 at 9:09 PM, Claudio Freire <klaussfre...@gmail.com> 
> wrote:
>> On Fri, Apr 26, 2013 at 9:01 PM, Michael Bayer <mike...@zzzcomputing.com> 
>> wrote:
>>>>>>> All attributes have to be expire-able and act as proxies for a database 
>>>>>>> connection so I'm not really sure where to go with that.    I'm not too 
>>>>>>> thrilled about proposals to build in various "alternate performance" 
>>>>>>> behaviors as the library starts to try to act in many different ways 
>>>>>>> that the vast majority of users aren't even aware of, it increases 
>>>>>>> complexity internally, produces vast amounts of new use cases to test 
>>>>>>> and maintain, etc.    I'm always willing to look at patches that are 
>>>>>>> all winning, of course, so if you have some way to speed things up 
>>>>>>> without breaking usage contracts and without major new 
>>>>>>> complexity/brittleness I'd love to look at a pull request.
>>>>>> 
>>>>>> I know, it's just a probe to see what kind of a speedup could be
>>>>>> obtained by not having that getter's interference. You know... simply
>>>>>> implementing InstrumentedAttribute in C could do the trick...
>>>>> 
>>>>> 
>>>>> In fact... I'm gonna try that...
>>>> 
>>>> feel free!  though you might be surprised, a C function that just calls 
>>>> out to all the same Python operations anyway is often only negligibly 
>>>> faster, not enough to make the extra complexity worth it.
>>> 
>>> also if you're looking to help with C, I'd love to get the C extensions out 
>>> in the Py3K version, we have a patch that's fallen out of date at 
>>> http://www.sqlalchemy.org/trac/ticket/2161 that needs freshening up and 
>>> testing.
>> 
>> Will look into that. The point of the C function is to be able to
>> quickly bypass all that _supports_population and function call
>> overheads. The getter is dead-simple, so its cost is dominated by
>> CPython function call overheads, that are readily removable by
>> re-implementing in C. It can reliably and quickly detect when
>> instance_dict returns __dict__, too.
> 
> Alright, I've got a POC C extension working (gotta profile it yet),
> although SQLAlchemy's weird injection of instance_dict forced me to
> some ugly hacks:
> 
> 
> class InstrumentedAttribute(QueryableAttribute):
>    """Class bound instrumented attribute which adds descriptor methods."""
> 
>    def __set__(self, instance, value):
>        self.impl.set(instance_state(instance),
>                        instance_dict(instance), value, None)
> 
>    def __delete__(self, instance):
>        self.impl.delete(instance_state(instance), instance_dict(instance))
> 
>    try:
>        from sqlalchemy.cinstrumented import InstrumentedGetter
>        __get__ = InstrumentedGetter(globals())
>        __get__.__name__ = '__get__'
>        del InstrumentedGetter
>    except ImportError:
>        def __get__(self, instance, owner):
>            if instance is None:
>                return self
> 
>            dict_ = instance_dict(instance)
>            if self._supports_population and self.key in dict_:
>                return dict_[self.key]
>            else:
>                return self.impl.get(instance_state(instance),dict_)
> 
> Thing is, doing the whole class in C makes no sense for set and
> delete, but it also complicates linking its instance_dict and
> instance_state to SA.attribute's.
> 
> This way looks ugly, but it reacts immediately to changing those
> globals, so it does seem like the better option.
> 
> Opinions (while I profile)?

I'd want to see the whole thing, like what's up with that globals() call, etc.  
 The instance_dict is shuttled around everywhere so that we aren't constantly 
pulling it from the given object; we have a system in place whereby the fact 
that instance_dict is object.__dict__ is not necessarily a given, and you can 
actually use some other system of getting at __dict__.   It saved us on a huge 
number of function calls at some point to expand it out like that, as 
inconvenient as it is.


-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to