連接使用itertools.chain
更高效。
>>> m = [[i] for i in range(200)]
>>> m
[[0], [1], [2], [3], [4], [5], [6], [7], [8], ...]
>>> from itertools import *
>>> list(chain(*m))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, ...]
就個人而言,我更喜歡這種過度列表理解,因爲它是很難記住這對於循環至上。甚至還有一個更有效的變體,list(chain.from_iterable(m))
。
微基準結果(使用timeit
模塊的Python 3 P的列表大小 X q意味着m = [list(range(q)) for _ in range(p)]
):
list size | chain(*m) | sum(m,[]) | list comp | flatten |
----------+------------+---------------+------------+------------+
2 x 1 | 1.78 µs | 0.646 µs | 0.905 µs | 1.49 µs |
20 x 1 | 4.37 µs | 7.49 µs | 5.19 µs | 3.59 µs |
200 x 1 | 26.9 µs | 134 µs | 40 µs | 24.4 µs |
2000 x 1 | 233 µs | 12.2 ms | 360 µs | 203 µs |
----------+------------+---------------+------------+------------+
2 x 1 | 1.78 µs | 0.646 µs | 0.905 µs | 1.49 µs |
2 x 10 | 2.55 µs | 0.899 µs | 3.14 µs | 2.2 µs |
2 x 100 | 9.07 µs | 2.03 µs | 17.2 µs | 8.55 µs |
2 x 1000 | 51.3 µs | 21.9 µs | 139 µs | 49.5 µs |
----------+------------+---------------+------------+------------+
chain(*m) -> list(chain(*m))
sum(m,[]) -> sum(m, [])
list comp -> [j for i in m for j in i]
flatten -> icfi = chain.from_iterable; list(icfi(m))
它表明sum
是高效僅當外列表大小爲很短。但是,你有一個更有效的變種:m[0]+m[1]
。
+1不是答案他一直在尋找,但這是一個有價值的建議。對於鏈表來說,它可以在性能方面表現出色,但在Python中很少見。 – delnan 2010-07-23 04:41:17
@delnan爲什麼在Python列表中這不會表現明智? – 2010-07-23 07:41:21
@Xavier:Python的'list'不是一個鏈表。 – kennytm 2010-07-23 10:40:34