String concatenation

Duncan Booth me at privacy.net
Mon Jun 21 04:05:49 EDT 2004


Peter Hansen <peter at engcorp.com> wrote in news:xvydnWNN7t2X50vdRVn-
gw at powergate.ca:

> Jonas Galvez wrote:
> 
>> Is it true that joining the string elements of a list is faster than
>> concatenating them via the '+' operator?
>> 
> Note that there's also '%s%s%s' % ('a', 'b', 'c'), which is
> probably on par with the join technique for both performance
> and lack of readability.

A few more points.

Yes, the format string in this example isn't the clearest, but if you have 
a case where some of the strings are fixed and others vary, then the format 
string can be the clearest.

e.g.

   '<a href="%s" alt="%s">%s</a>' % (uri, alt, text)

rather than:

   '<a href="'+uri+'" alt="'+alt+'">'+text+'</a>'

In many situations I find I use a combination of all three techniques. 
Build a list of strings to be concatenated to produce the final output, but 
each of these strings might be built from a format string or simple 
addition as above.

On the readability of ''.join(), I would suggest never writing it more than 
once. That means I tend to do something like:

    concatenate = ''.join
    ...
    concatenate(myList)

Or

    def concatenate(*args):
        return ''.join(args)
    ...
    concatenate('a', 'b', 'c')

depending on how it is to be used.

It's also worth saying that a lot of the time you find you don't want the 
empty separator at all, (e.g. maybe newline is more appropriate), and in 
this case the join really does become easier than simple addition, but 
again it is worth wrapping it so that your intention at the point of call 
is clear.

Finally, a method call on a bare string (''.join, or '\n'.join) looks 
sufficiently bad that if, for some reason, you don't want to give it a name 
as above, I would suggest using the alternative form for calling it:

   str.join('\n', aList)

rather than:

   '\n'.join(aList)



More information about the Python-list mailing list