[Twisted-Python] Components

Phillip J. Eby pje at telecommunity.com
Thu Feb 26 15:06:09 MST 2004


At 03:41 PM 2/26/04 -0500, Bob Ippolito wrote:
>PyProtocols has written-in-C code for acceleration, I bet it wins, even 
>though it does do more work (which I believe happens *up front*, so 
>doesn't really affect runtime performance) with transitive adaptation.

Adapter lookup time in PyProtocols is roughly equivalent to 5 attribute 
lookups: __conform__, __adapt__, __class__, __mro__ or __bases__, and 
finally the adapter itself.  All of the transitive computation occurs up 
front, so the actual adapter lookup consists of looking up each class in 
the adaptee's __mro__ in a single dictionary.  (IOW, it's basically the 
same as a Python attribute lookup, which walks the __mro__ and does a 
dictionary lookup for each base class until the attribute is 
found.)  Adapter execution time is of course dependent on what the adapter 
does.  :)

The C code achieved about a 2-4x speedup over pure Python, mainly by 
cutting out function call and loop overhead, not by changing the 
fundamental algorithm, which can't really be improved upon without making 
assumptions I didn't want to make.  For example, if I were willing to 
assume that classes would never have their __bases__ or __mro__ changed, I 
could cache lookup results and thus occasionally save a few dictionary 
lookups.  However, for a general-purpose Python tool, I thought it better 
to support as much of Python's dynamic nature as practical.  (I *do* assume 
that protocol relationships are not dynamic, however.)





More information about the Twisted-Python mailing list