summaryrefslogtreecommitdiffstats
path: root/Doc/faq
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2011-11-25 15:34:23 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2011-11-25 15:34:23 (GMT)
commite333d00d3ae71467454d94fbd9ece93c1e821022 (patch)
tree72bf479303b7b31f629deeb5c8ae7cfc350a2a5e /Doc/faq
parent0481f4bca45fbe9b3c3f2a2d7135fcbd8b34dc30 (diff)
parentfd9ebd4a361805607baea3e038652f207575ced8 (diff)
downloadcpython-e333d00d3ae71467454d94fbd9ece93c1e821022.zip
cpython-e333d00d3ae71467454d94fbd9ece93c1e821022.tar.gz
cpython-e333d00d3ae71467454d94fbd9ece93c1e821022.tar.bz2
Clarify concatenation behaviour of immutable strings, and remove explicit
mention of the CPython optimization hack.
Diffstat (limited to 'Doc/faq')
-rw-r--r--Doc/faq/programming.rst26
1 files changed, 26 insertions, 0 deletions
diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst
index d1a3daf..f157a94 100644
--- a/Doc/faq/programming.rst
+++ b/Doc/faq/programming.rst
@@ -989,6 +989,32 @@ What does 'UnicodeDecodeError' or 'UnicodeEncodeError' error mean?
See the :ref:`unicode-howto`.
+What is the most efficient way to concatenate many strings together?
+--------------------------------------------------------------------
+
+:class:`str` and :class:`bytes` objects are immutable, therefore concatenating
+many strings together is inefficient as each concatenation creates a new
+object. In the general case, the total runtime cost is quadratic in the
+total string length.
+
+To accumulate many :class:`str` objects, the recommended idiom is to place
+them into a list and call :meth:`str.join` at the end::
+
+ chunks = []
+ for s in my_strings:
+ chunks.append(s)
+ result = ''.join(chunks)
+
+(another reasonably efficient idiom is to use :class:`io.StringIO`)
+
+To accumulate many :class:`bytes` objects, the recommended idiom is to extend
+a :class:`bytearray` object using in-place concatenation (the ``+=`` operator)::
+
+ result = bytearray()
+ for b in my_bytes_objects:
+ result += b
+
+
Sequences (Tuples/Lists)
========================