State Machines in Python

Stefan Behnel stefan_ml at behnel.de
Sat Sep 4 10:41:46 EDT 2010


Jack Keegan, 04.09.2010 15:36:
> Hi girls&  guys,
>
> Just joined the group. I'm new to Python but been picking it up pretty easy.
> I love it!

Welcome to the group.


> I'm hoping to use it to make a controlling application for an
> experiment. Basically I want to use it to interface with some data
> acquisition (DAQ) hardware to accept incoming signals and respond sending
> signals to the outputs. I'm looking for an efficient State Machine algorithm
> as I need the timing to be as good as possible.
> As there is no switch statement in Python, I've been looking around for a
> good implementation. Most of the algorithms I've come across seem to be
> based on parsing applications. I'd like something more suited to my needs.
> I'd like to avoid excessive use of 'if-elif-else' statements as each would
> have to be checked to find the right conditions which would have an time
> overhead involved. I have seen an implementation of the switch using
> dictionaries but someone had commented that creating and throwing away
> dictionaries also comes at a cost.
> I was wondering if any of you could advise or point me in the right
> direction.

Dictionaries are a common way to do it, and there are different recipes. A 
second way is a class that dispatches to its methods. A third (IMHO rather 
beautiful) way is coroutines:

http://gnosis.cx/publish/programming/charming_python_b5.html
http://www.dabeaz.com/coroutines/Coroutines.pdf

However, you'll have to do some benchmarking if you care about performance. 
Dictionaries are fast and likely the fastest way to do it, but coroutines 
are a lot more versatile. Stackless Python might also be worth a look in 
this context, it's fast *and* versatile.

You should also be aware that there are various event driven frameworks 
(like Twisted, eventlet and others) that make asynchronous event handling 
fast and easy, and that use much higher-level abstractions than pure state 
machines.

Stefan




More information about the Python-list mailing list