def join(a):
"""Joins a sequence of sequences into a single sequence. (One-level flattening.)
E.g., join([(1,2,3), [4, 5], [6, (7, 8, 9), 10]]) = [1,2,3,4,5,6,(7,8,9),10]
This is very efficient, especially when the subsequences are long.
"""
n = sum([len(b) for b in a])
l = [None]*n
i = 0
for b in a:
j = i+len(b)
l[i:j] = b
i = j
return l
def join2(a):
result = []
for x in a:
result.extend(x)
return result
def join3(a):
result = []
map(result.extend, a)
return result
def join4(a):
return reduce(lambda l, r: l.extend(r) or l, a, [])
testdata = [range(t) for t in range(100, 200)]
import timeit, pprint
results = [
(funcname, timeit.timeit(lambda: func(testdata), number=150))
for funcname, func in locals().items()
if hasattr(func, '__call__')]
pprint.pprint(sorted(results, key=lambda x: x[1]))
ZGVmIGpvaW4oYSk6CiAgICAiIiJKb2lucyBhIHNlcXVlbmNlIG9mIHNlcXVlbmNlcyBpbnRvIGEgc2luZ2xlIHNlcXVlbmNlLiAgKE9uZS1sZXZlbCBmbGF0dGVuaW5nLikKICAgIEUuZy4sIGpvaW4oWygxLDIsMyksIFs0LCA1XSwgWzYsICg3LCA4LCA5KSwgMTBdXSkgPSBbMSwyLDMsNCw1LDYsKDcsOCw5KSwxMF0KICAgIFRoaXMgaXMgdmVyeSBlZmZpY2llbnQsIGVzcGVjaWFsbHkgd2hlbiB0aGUgc3Vic2VxdWVuY2VzIGFyZSBsb25nLgogICAgIiIiCiAgICBuID0gc3VtKFtsZW4oYikgZm9yIGIgaW4gYV0pCiAgICBsID0gW05vbmVdKm4KICAgIGkgPSAwCiAgICBmb3IgYiBpbiBhOgogICAgICAgIGogPSBpK2xlbihiKQogICAgICAgIGxbaTpqXSA9IGIKICAgICAgICBpID0gagogICAgcmV0dXJuIGwKICAgIApkZWYgam9pbjIoYSk6CiAgICByZXN1bHQgPSBbXQogICAgZm9yIHggaW4gYToKICAgICAgICByZXN1bHQuZXh0ZW5kKHgpCiAgICByZXR1cm4gcmVzdWx0CiAgICAgICAgCmRlZiBqb2luMyhhKToKICAgIHJlc3VsdCA9IFtdCiAgICBtYXAocmVzdWx0LmV4dGVuZCwgYSkKICAgIHJldHVybiByZXN1bHQKICAgIApkZWYgam9pbjQoYSk6CiAgICByZXR1cm4gcmVkdWNlKGxhbWJkYSBsLCByOiBsLmV4dGVuZChyKSBvciBsLCBhLCBbXSkKCnRlc3RkYXRhID0gW3JhbmdlKHQpIGZvciB0IGluIHJhbmdlKDEwMCwgMjAwKV0KCmltcG9ydCB0aW1laXQsIHBwcmludApyZXN1bHRzID0gWwogICAgKGZ1bmNuYW1lLCB0aW1laXQudGltZWl0KGxhbWJkYTogZnVuYyh0ZXN0ZGF0YSksIG51bWJlcj0xNTApKQogICAgZm9yIGZ1bmNuYW1lLCBmdW5jIGluIGxvY2FscygpLml0ZW1zKCkKICAgIGlmIGhhc2F0dHIoZnVuYywgJ19fY2FsbF9fJyldCnBwcmludC5wcHJpbnQoc29ydGVkKHJlc3VsdHMsIGtleT1sYW1iZGEgeDogeFsxXSkp