Python code written in 1998, how to improve/change it?
Bengt Richter
bokr at oz.net
Fri Jan 20 18:52:20 EST 2006
On Thu, 19 Jan 2006 23:16:57 -0500, Peter Hansen <peter at engcorp.com> wrote:
>Carl Cerecke wrote:
>> Carl Cerecke wrote:
>>>Ah. Well, my post suggested, as one option, the callables call
>>>each other directly.
>>
>> Doh! No I didn't. And they shouldn't. Otherwise the call stack
>> gets out of hand. But I did suggest that each callable representing a
>> state set a global variable, just before it returns, to the callable
>> representing the next state to be called. Still no map required. Just a
>> while loop. In any case, the function call/return is wasted cycles.
>
>I believe the more modern approach to this is to use generators in some
>way, yield each other as the next state. This way you avoid all almost
>all the function call overhead (the part that takes significant time,
>which is setting up the stack frame) and don't have to resort to
>bytecode hacks for better performance.
>
>Of course, if you have a state machine with many small states each doing
>a tiny bit of processing and you're still concerned over performance,
>you probably should be looking into Pysco or Pyrex and avoid making your
>code really unreadable.
>
How about something like
>>> actions = dict(
... a=compile('print "A"; state="b"','','exec'),
... b=compile('print "B"; state="c"','','exec'),
... c=compile('print "C"; state=None','','exec')
... )
>>> state = 'a'
>>> while state: eval(actions[state])
...
A
B
C
Regards,
Bengt Richter
More information about the Python-list
mailing list