Fastest technique for string concatenation

Peter Otten __peter__ at web.de
Sun Oct 3 05:00:26 EDT 2010


python at bdurham.com wrote:

> My understanding is that appending to a list and then joining
> this list when done is the fastest technique for string
> concatenation. Is this true?
> 
> The 3 string concatenation techniques I can think of are:
> 
> - append to list, join
> - string 'addition' (s = s + char)
> - cStringIO
> 
> The code that follows my signature confirms that the list
> append/join technique is indeed the fastest of these 3
> approaches, but perhaps there are other techniques I should
> consider?
> 
> Malcolm
> 
> # test various techniques for string concatenation
> import cStringIO
> import timeit
> source = 'x' * 5000000
> def testListAppend():
>     output = list()
>     for char in source:
>         output.append( char )
>     output = ''.join( output )

You are measuring list creation here, not string concatenation:

$ python -m timeit -s's = "x"*10**5' 'd = []' 'for c in s: d.append(c)'
10 loops, best of 3: 20.9 msec per loop
$ python -m timeit -s's = ["x"]*10**5' '"".join(s)'
100 loops, best of 3: 2.47 msec per loop

To fix that I'd start with a list, not a string:

source = ["x"] * 5000000

> def testStringIO():
>     output = cStringIO.StringIO()
>     for char in source:
>         output.write( char )
>     output = output.getvalue()

You can simplify that to

def test_stringio():
    output = cStringIO.StringIO()
    output.writelines(source) # doesn't add newlines
    output = output.getvalue()

which is almost as fast as ''.join:

$ python -m timeit -s's = ["x"]*10**5' '"".join(s)'
100 loops, best of 3: 2.47 msec per loop

$ python -m timeit -s's = ["x"]*10**5' -s 'from cStringIO import StringIO' 
'o = StringIO(); o.writelines(s); o.getvalue()'
100 loops, best of 3: 2.88 msec per loop

Peter




More information about the Python-list mailing list