Method much slower than function?

Peter Otten __peter__ at web.de
Thu Jun 14 13:32:14 EDT 2007


Chris Mellon wrote:

> On 6/14/07, Peter Otten <__peter__ at web.de> wrote:
>> Peter Otten wrote:
>>
>> > Leo Kislov wrote:
>> >
>> >> On Jun 13, 5:40 pm, ido... at gmail.com wrote:
>> >>> Hi all,
>> >>>
>> >>> I am running Python 2.5 on Feisty Ubuntu. I came across some code
>> >>> that is substantially slower when in a method than in a function.
>> >>>
>> >>> >>> cProfile.run("bar.readgenome(open('cb_foo'))")
>> >>>
>> >>>          20004 function calls in 10.214 CPU seconds
>> >>
>> >>> >>> cProfile.run("z=r.readgenome(open('cb_foo'))")
>> >>>
>> >>>          20004 function calls in 0.041 CPU seconds
>> >>>
>> >>
>> >> I suspect open files are cached so the second reader
>> >> picks up where the first one left: at the of the file.
>> >> The second call doesn't do any text processing at all.
>> >>
>> >>   -- Leo
>> >
>> > Indeed, the effect of attribute access is much smaller than what the OP
>> > is seeing:
>>
>> I have to take that back
>>
> 
> Your tests (which I have snipped) show attribute access being about 3x
> slower than local access, which is consistent with my own tests. The
> OP is seeing a speed difference of 2 orders of magnitude. That's far
> outside the range that attribute access should account for.

Not if it conspires to defeat an optimization for string concatenation

$ cat iadd.py
class A(object):
    def add_attr(self):
        self.x = ""
        for i in xrange(10000):
            self.x += " yadda"
    def add_local(self):
        x = ""
        for i in xrange(10000):
            x += " yadda"

add_local = A().add_local
add_attr = A().add_attr
$ python2.5 -m timeit -s'from iadd import add_local' 'add_local()'
100 loops, best of 3: 3.15 msec per loop
$ python2.5 -m timeit -s'from iadd import add_attr' 'add_attr()'
10 loops, best of 3: 83.3 msec per loop

As the length of self.x grows performance will continue to degrade.
The original test is worthless as I tried to explain in the section you
snipped.

Peter




More information about the Python-list mailing list