[Python-Dev] LOAD_SELF and SELF_ATTR opcodes

Phillip J. Eby pje at telecommunity.com
Sat Oct 15 01:33:44 CEST 2005


At 12:33 AM 10/15/2005 +0200, Martin v. Löwis wrote:
>Phillip J. Eby wrote:
> > Anyway, my main question is, do these sound like worthwhile
> > optimizations?
>
>In the past, I think the analysis was always "no". It adds
>an opcode, so increases the size of the switch, causing
>more pressure on the cache, with an overall questionable
>effect.

Hm.  I'd have thought 5% pystone and 2% pybench is nothing to sneeze at, 
for such a minor change.  I thought Skip's peephole optimizer originally 
only produced a 5% or so speedup.

In any case, in relation to this specific kind of optimization, this is the 
only thing I found:

     http://mail.python.org/pipermail/python-dev/2002-February/019854.html

which is a proposal by Guido to do the same thing, but also speeding up the 
actual attribute lookup.  I didn't find any follow-up suggesting that 
anybody tried this, but perhaps it was put on hold pending the AST branch?  :)


>As for measuring the effect of the change: how often
>does that pattern occur in the standard library?
>(compared to what total number of LOAD_ATTR)

[pje at ns src]$ grep 'self\.[A-Za-z_]' Lib/*.py | wc -l
    9919

[pje at ns src]$ grep '[a-zA-Z_][a-zA-Z_0-9]*\.[a-zA-Z_]' Lib/*.py | wc -l
   19804

So, something like 50% of lines doing an attribute access include a 'self' 
attribute access.  This very rough estimate may be thrown off by:

* Import statements (causing an error in favor of more non-self attributes)
* Functions whose first argument isn't 'self' (error in favor of non-self 
attributes)
* Comments or docstrings talking about attributes or modules (could go 
either way)
* Multiple attribute accesses on the same line (could go either way)

The parrotbench code shows a similar ratio of self to non-self attribute 
usage, but nearly all of parrotbench's self-attribute usage is in b0.py, 
and not called in the innermost loop.

That also suggests that the volume of usage of 'self.' isn't the best way 
to determine the performance impact, because pystone has almost no 'self.' 
usage at all, but still got a 5% total boost.



More information about the Python-Dev mailing list