On Feb 18, 2012, at 8:05 PM, Andrey Popp wrote:
> On Sat, Feb 18, 2012 at 07:57:14PM -0500, Michael Bayer wrote:
>> I don't know that customizing instrumentationmanager is all you'd need.
>> There's lots of bookkeeping occurring with instancestate that takes time and
>> is related to state tracking and persistence. The whole need for
>> __setstate__ is due to the instancestate object. Not including it suggests
>> an entirely new system that at most would consume rows from the orm.Query and
>> route them into this alternate system.
>
> Well, I didn't want to implement entirely new system, but just to separate
> part of ORM which manages persistence from part of ORM which just map database
> columns to instance attrs.
As it is now, you can get named tuples out of Query that should be serializable
and don't use InstanceState. Rows from an execute() call also behave like
named tuples and are serializable. So I assume here you're looking for objects
that also have collections and related instances, including lazy and eager
loading of those, minus the usage of an InstanceState which you're saying is
too expensive to deserialize, or a simplified InstanceState that is somehow not
quite as expensive to deserialize, though really you'd be talking about shaving
off maybe 10-20% of function calls if it were only a simplification of
InstanceState.
It would be a major new feature add requiring architectural changes, tests, and
most importantly a clear documentation story that makes the rationale for this
alternate mode very clear and makes it totally unambiguous when this mode might
be used - else the entire project is diluted by echos of "too many ways to do
it", "too confusing", "too complicated", etc. It's complicating the internals
and API for an use case that may very well be completely obsolete in a year or
two due to Pypy and other performance techniques. The actual performance
savings may be marginal in any case.
Optimizing InstanceState while maintaining it's current behavioral contract
exactly would be a lot more straightforward, requiring no complications to
internals, API or documentation story. Methods here include experimenting
with various forms of inlining inside of __setstate__() (such as inlining the
call to setup_instance() when the default instrumentation manager is in use) as
well as experimenting with a C port. There's not much that happens inside of
__setstate__() as it is.
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.