Method much slower than function?
Peter Otten
__peter__ at web.de
Thu Jun 14 03:31:45 EDT 2007
Gabriel Genellina wrote:
> En Thu, 14 Jun 2007 01:39:29 -0300, sjdevnull at yahoo.com
> <sjdevnull at yahoo.com> escribió:
>
>> Gabriel Genellina wrote:
>>> In addition, += is rather inefficient for strings; the usual idiom is
>>> using ''.join(items)
>>
>> Ehh. Python 2.5 (and probably some earlier versions) optimize += on
>> strings pretty well.
>>
>> a=""
>> for i in xrange(100000):
>> a+="a"
>>
>> and:
>>
>> a=[]
>> for i in xrange(100000):
>> a.append("a")
>> a="".join(a)
>>
>> take virtually the same amount of time on my machine (2.5), and the
>> non-join version is clearer, IMO. I'd still use join in case I wind
>> up running under an older Python, but it's probably not a big issue
>> here.
>
> Yes, for concatenating a lot of a's, sure... Try again using strings
> around the size of your expected lines - and make sure they are all
> different too.
>
> py> import timeit
> py>
> py> def f1():
> ... a=""
> ... for i in xrange(100000):
> ... a+=str(i)*20
> ...
> py> def f2():
> ... a=[]
> ... for i in xrange(100000):
> ... a.append(str(i)*20)
> ... a="".join(a)
> ...
> py> print timeit.Timer("f2()", "from __main__ import f2").repeat(number=1)
> [0.42673663831576358, 0.42807591467630662, 0.44401481193838876]
> py> print timeit.Timer("f1()", "from __main__ import f1").repeat(number=1)
>
> ...after a few minutes I aborted the process...
I can't confirm this.
$ cat join.py
def f1():
a = ""
for i in xrange(100000):
a += str(i)*20
def f2():
a = []
for i in xrange(100000):
a.append(str(i)*20)
a = "".join(a)
def f3():
a = []
append = a.append
for i in xrange(100000):
append(str(i)*20)
a = "".join(a)
$ python2.5 -m timeit -s 'from join import f1' 'f1()'
10 loops, best of 3: 212 msec per loop
$ python2.5 -m timeit -s 'from join import f2' 'f2()'
10 loops, best of 3: 259 msec per loop
$ python2.5 -m timeit -s 'from join import f3' 'f3()'
10 loops, best of 3: 236 msec per loop
Peter
More information about the Python-list
mailing list