[Tutor] __iter__ loops, partitioning list among children
Eric Abrahamsen
eric at ericabrahamsen.net
Thu Aug 28 08:59:19 CEST 2008
I finally got my iterator-based version working, only to discover that
it's nearly four times slower than the brute-force multiple-loops
version I started with! Then I tried just adding an incrementing index
to the loop, so that each loop only ran through
self.events[last_index:], but that was still twice as slow as without
the index. I suppose it's the overhead of incrementing the variable,
or maybe some optimization in Python's internals, but the take home
lesson was definitely 'leave well enough alone'. Anyway, thanks again
for the advice, it's been a learning experience...
E
On Aug 27, 2008, at 2:22 AM, Kent Johnson wrote:
> On Tue, Aug 26, 2008 at 1:24 PM, Eric Abrahamsen
> <eric at ericabrahamsen.net> wrote:
>> On Aug 26, 2008, at 7:20 PM, Kent Johnson wrote:
>
>>> If all you want to do with the nested Month, etc is to iterate the
>>> events in them, you could probably use a shared iterator. It would
>>> have to be able to push-back items so that when you hit the
>>> out-of-range item you could push it back on the iterator.
>>
>> Is a 'shared iterator' something special, or do you mean all the
>> instances
>> would draw their events from a single iterator? I'm not sure what
>> this would
>> look like.
>
> It's nothing special, I just mean that all instances would share an
> iterator. You would pass the iterator to the iteration function.
>
>> Just for the sake of argument, here's the principle I'm working from:
>>
>> #####
>>>>> lst = range(10)
>>>>> iterlst = iter(lst)
>>>>> iterlst.next()
>> 0
>>>>> for x in iterlst:
>> ... if x < 5:
>> ... print x
>> ... else:
>> ... break
>> ...
>> 1
>> 2
>> 3
>> 4
>>>>> for x in iterlst:
>> ... print x
>> ...
>> 6
>> 7
>> 8
>> 9
>> #####
>>
>> So that's why I'm creating the iterator outside of the while loop
>> in the
>> original code, and then using a repeated for loop with a break to
>> step
>> through all the events only once. Of course, the fact that 5 isn't
>> in there
>> probably points to the source of my problems! The solution might be
>> assigning iterlist.next() to a variable, and advancing the variable.
>
> The problem is that the first loop consumes the 5 from the iterator
> but doesn't actually process it. That is why you need an iterator with
> push-back - so you can put the 5 "back in" the iterator and get it out
> again in the next loop.
> http://code.activestate.com/recipes/502304/
> Though working with indices directly might be simpler.
>
> Kent
More information about the Tutor
mailing list