Controlling a generator the pythonic way
Steve Holden
steve at holdenweb.com
Mon Jun 13 11:56:19 EDT 2005
Thomas Lotze wrote:
> Peter Hansen wrote:
>
>
>>Thomas Lotze wrote:
>>
>>>I can see two possibilities to do this: either the current file position
>>>has to be read from somewhere (say, a mutable object passed to the
>>>generator) after each yield, [...]
>>
>>The third approach, which is certain to be cleanest for this situation, is
>>to have a custom class which stores the state information you need, and
>>have the generator simply be a method in that class.
>
>
> Which is, as far as the generator code is concerned, basically the same as
> passing a mutable object to a (possibly standalone) generator. The object
> will likely be called self, and the value is stored in an attribute of it.
>
> Probably this is indeed the best way as it doesn't require the programmer
> to remember any side-effects.
>
> It does, however, require a lot of attribute access, which does cost some
> cycles.
>
Hmm, you could probably make your program run even quicker if you took
out all the code :-)
Don't assume that there will be a perceptible impact on performance
until you have written it they easy way. I'll leave you to Google for
quotes from Donald Knuth about premature optimization.
> A related problem is skipping whitespace. Sometimes you don't care about
> whitespace tokens, sometimes you do. Using generators, you can either set
> a state variable, say on the object the generator is an attribute of,
> before each call that requires a deviation from the default, or you can
> have a second generator for filtering the output of the first. Again, both
> solutions are ugly (the second more so than the first). One uses
> side-effects instead of passing parameters, which is what one really
> wants, while the other is dumb and slow (filtering can be done without
> taking a second look at things).
>
And, again, your obsession with performance obscure the far more
important issue: which solution is easiest to write and maintain. If the
user then turns up short of cycles they can always elect to migrate to a
faster computer: this will almost inevitably be cheaper than paying you
to speed the program up.
> All of this makes me wonder whether more elaborate generator semantics
> (maybe even allowing for passing arguments in the next() call) would not
> be useful. And yes, I have read the recent postings on PEP 343 - sigh.
>
Sigh indeed. But if you allow next() calls to take arguments you are
effectively arguing for the introduction of full coroutines into the
language, and I suspect there would be pretty limited support for that.
regards
Steve
--
Steve Holden +1 703 861 4237 +1 800 494 3119
Holden Web LLC http://www.holdenweb.com/
Python Web Programming http://pydish.holdenweb.com/
More information about the Python-list
mailing list