Winter Madness - Passing Python objects as Strings

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Sat Jun 6 00:43:37 EDT 2009


En Fri, 05 Jun 2009 12:33:04 -0300, Hendrik van Rooyen  
<mail at microcorp.co.za> escribió:
>  "Gabriel Genellina" <ga..y2 at yahoo.com.ar> wrote:
>
>> But if you already have a queue, you may put other objects there  
>> (instead
>> of "canning" them). Testing the object type with isinstance(msg, str) is
>> pretty fast, and if you bind locally those names I'd say the overhead is
>> negligible.
>
> Maybe you are right and I am pre optimising - but the heart of this
> box really is that silly loop and the processor really is not fast at  
> all.

 From your description of the problem, it seems you are acting upon  
messages received from a serial port. You have to process the message  
*before* the next one arrives -- but you gain nothing doing that much  
faster. In other words, even with a blazingly fast processor, you can't do  
things faster than the rate of incoming messages.

In any case, you have to test-and-branch in the code. Either with  
isinstance(rec,str), either with rec_list[0]=="B", or something. I'm  
unsure if this is the fastest approach - intuition doesn't play well with  
timings in Python, better to actually measure times.

> This is what I was trying to avoid, as it is important to get as much
> performance out of the box as I can (given that I am using Python to
> get the job done fast, because that is also important). So it is a kind  
> of
> juggling with priorities - "make it fast" would imply do not use python,
> but "get it done quickly" implies using python, and it looks to me that
> if I am careful and think more like an assembler programmer, the
> real time performance will be adequate.  And I do not want to do
> anything that could conceivably compromise that.  Even if it means
> jumping through a funny hoop like I am doing now, and inventing
> a weird way to pass an object.

If it works and you feel it's adequate, that's fine. I cannot count how  
many times I've used an integer property to attach a pointer to another  
object (in other languages), but I felt "dirty" doing that. And never did  
something like that in Python...

> So to a large extent I think that I am doing the job as fast as it is
> possible - the comma delimited input string is a fact, decided on
> between myself and the customer a long time ago, and it comes over
> a socket, so it has to be a string.  The least I can do with it is  
> nothing
> before I put it on the critical queue. Then when it comes out of the
> queue, I have to break it up into its constituent parts, and I would  
> think
> that split is the canonical way of doing that.

Ok, what if you split *before* putting in the queue? In the receiving side  
of the queue, just remove the split(",") part (it's already done). This  
does not add anything to the critical path - the split must be done anyway.

Now, instead of building a fake string "B,cannedobject" and uncanning on  
the other side, you can simply put a tuple in the queue ("B", the_object)  
and just get the object on the other side. If I'm not misunderstanding  
your problem, I think this is the cleanest way to do that.

-- 
Gabriel Genellina




More information about the Python-list mailing list