Chris Mellon wrote: > On 6/14/07, Peter Otten <[EMAIL PROTECTED]> wrote: >> Peter Otten wrote: >> >> > Leo Kislov wrote: >> > >> >> On Jun 13, 5:40 pm, [EMAIL PROTECTED] 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 -- http://mail.python.org/mailman/listinfo/python-list