Ah, looking more closely i see you're replacing self.entries with a
list, not insorting into a SA list collection- that's totally ok. It
might squeeze a little more speed out to do:
updated_entries = list(self.entries) + new_entries
base = len(self.entries)
for idx, entry in enumerate(new_entries):
entry.position = base + idx
self.entries = updated_entries
orderinglist's extend method could be made to do something much like the
above quite efficiently.
jason kirtland wrote:
> A warning: that depends on a bug in the C version of bisect. When given
> a list subclass, it mistakenly ignores the subclass method
> implementations. The below will break, if and when that's fixed to
> match the pure Python implementation in the standard lib.
>
> Calling list.extend(account_entries, new_entries) is probably a safe
> alternative.
>
> * http://bugs.python.org/issue3935
>
> jean-philippe dutreve wrote:
>> What I've done is something like this:
>>
>> account_entries = self.entries[:]
>> for entry in new_entries:
>> insort_right(account_entries, entry)
>> for i, entry in enumerate(account_entries):
>> entry.position = i
>> self.entries = account_entries
>>
>> Don't know if it's the right way to do it but it's much faster.
>>
>> On 22 sep, 18:41, jason kirtland <[EMAIL PROTECTED]> wrote:
>>> I'm sure there is potential for improvement on the current orderinglist
>>> code- please feel free to send a patch with optimizations you've found
>>> to the SA trac.
>>>
>>> The orderinglist hasn't changed much since 0.3, but with 0.5 there may
>>> be entirely new implementations possible. For example, I could imagine
>>> one that defers calculation and manipulation of the positioning
>>> information until a before_flush hook. That may be perform better, with
>>> the trade-off that the position attribute can't be trusted to be in sync
>>> with the list order.
>>>
>>> jean-philippe dutreve wrote:
>>>> Below is the profiling of code that added 1200 items into an
>>>> ordering_list relation. I had to bypass the ordering_list stuff for
>>>> bulk additions in order to have better performance (down to 2
>>>> seconds).
>>>> Hope this post helps to improve this part (using 0.5.0rc1, python 2.5,
>>>> linux i686, 1.5Go RAM)
>>>> SA is rocking!
>>>> jean-philippe
>>>> Time elapsed: 48.4475638866 s
>>>> 8875046 function calls (8869157 primitive calls) in 48.443
>>>> CPU seconds
>>>> Ordered by: internal time, call count
>>>> List reduced from 390 to 10 due to restriction <10>
>>>> ncalls tottime percall cumtime percall
>>>> filename:lineno(function)
>>>> 1292937/1292250 7.879 0.000 12.134 0.000 attributes.py:
>>>> 132(__get__)
>>>> 1241013 7.662 0.000 39.836 0.000 orderinglist.py:
>>>> 221(_order_entity)
>>>> 1241013 5.870 0.000 16.916 0.000 orderinglist.py:
>>>> 202(_get_order_value)
>>>> 440809 4.522 0.000 9.527 0.000 attributes.py:394(set)
>>>> 1236 4.198 0.003 44.025 0.036 orderinglist.py:
>>>> 208(reorder)
>>>> 1299736/1299048 3.752 0.000 4.373 0.000 attributes.py:
>>>> 310(get)
>>>> 448225 3.337 0.000 5.157 0.000 identity.py:
>>>> 208(modified_event)
>>>> 437061 2.704 0.000 14.331 0.000 orderinglist.py:
>>>> 205(_set_order_value)
>>>> 440809 2.225 0.000 11.752 0.000 attributes.py:
>>>> 126(__set__)
>>>> 448225 1.775 0.000 1.812 0.000 attributes.py:
>>>> 958(modified_event)
>>>> Function was called by...
>>>> attributes.py:132(__get__) <- domain.py:200(addEntry)
>>>> (1236) 46.741
>>>> domain.py:248(__init__)
>>>> (1236) 47.832
>>>> domain.py:272(get)(49452)
>>>> 0.609
>>>> orderinglist.py:
>>>> 202(_get_order_value)(1241013) 16.916
>>>> orderinglist.py:221(_order_entity) <- orderinglist.py:208(reorder)
>>>> (1240326) 44.025
>>>> orderinglist.py:232(append)
>>>> (687) 0.013
>>>> orderinglist.py:202(_get_order_value) <- orderinglist.py:
>>>> 221(_order_entity)(1241013) 39.836
>>>> attributes.py:394(set) <- attributes.py:126(__set__)
>>>> (440809) 11.752
>>>> orderinglist.py:208(reorder) <- orderinglist.py:
>>>> 266(__setslice__)(1236) 44.061
>>>> attributes.py:310(get) <- attributes.py:132(__get__)
>>>> (1292937) 12.134
>>>> attributes.py:
>>>> 347(get_committed_value)(1) 0.000
>>>> attributes.py:500(set)
>>>> (3708) 0.367
>>>> attributes.py:
>>>> 837(value_as_iterable)(3090) 0.108
>>>> identity.py:208(modified_event) <- attributes.py:394(set)
>>>> (440809) 9.527
>>>> attributes.py:
>>>> 525(fire_replace_event)(3708) 0.236
>>>> attributes.py:
>>>> 579(fire_append_event)(3708) 1.960
>>>> orderinglist.py:205(_set_order_value) <- orderinglist.py:
>>>> 221(_order_entity)(437061) 39.836
>>>> attributes.py:126(__set__) <- domain.py:
>>>> 237(_set_attributes)(1276) 0.079
>>>> domain.py:255(update)
>>>> (2472) 0.089
>>>> orderinglist.py:
>>>> 205(_set_order_value)(437061) 14.331
>>>> attributes.py:958(modified_event) <- identity.py:
>>>> 208(modified_event)(448225) 5.157
>
>
> >
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---