扁平化列表,哪個(gè)方法更快?
在平時(shí)的編碼過(guò)程中,經(jīng)常會(huì)碰到嵌套列表扁平化的需求,比如說(shuō)把列表[[1,2,3],[4,5]] 變成 [1,2,3,4,5],Python 有很多方法可以實(shí)現(xiàn)這一功能,到底哪個(gè)方法更快呢?我們今天就來(lái)試一試。
第一種方法:建一個(gè)空列表,遍歷嵌套列表把元素逐一放入并返回:
- def flatten1(lst: List[list]) -> list:
- flat = []
- for l in lst:
- for x in l:
- flat.append(x)
- return flat
第二種方法:使用列表推導(dǎo)式:
- def flatten2(lst: List[list]) -> list:
- return [x for l in lst for x in l]
第三種方法:使用列表的 extend 方法:
- def flatten3(lst: List[list]) -> list:
- flat = []
- for l in lst:
- flat.extend(l)
- return flat
第四種方法:使用 + 號(hào):
- def flatten4(lst: List[list]) -> list:
- flat = []
- for l in lst:
- flat += l
- return flat
第五種方法:使用 itertools.chain:
- def flatten5(lst: List[list]) -> list:
- return list(itertools.chain.from_iterable(lst))
第六種方法:使用 functools.reduce:
- def flatten6(lst: List[list]) -> list:
- return functools.reduce(operator.iconcat, lst, [])
你可以先猜一下,然后看看下面的運(yùn)行結(jié)果:
- import functools
- import itertools
- import operator
- import random
- import time
- from typing import List
- def flatten1(lst: List[list]) -> list:
- flat = []
- for l in lst:
- for x in l:
- flat.append(x)
- return flat
- def flatten2(lst: List[list]) -> list:
- return [x for l in lst for x in l]
- def flatten3(lst: List[list]) -> list:
- flat = []
- for l in lst:
- flat.extend(l)
- return flat
- def flatten4(lst: List[list]) -> list:
- flat = []
- for l in lst:
- flat += l
- return flat
- def flatten5(lst: List[list]) -> list:
- return list(itertools.chain.from_iterable(lst))
- def flatten6(lst: List[list]) -> list:
- return functools.reduce(operator.iconcat, lst, [])
- # +=
- def time_f(f):
- elapsed = 0.0
- n = 100
- M = 1000
- N = 100
- for _ in range(n):
- lst = [[random.randint(0,1000000) for j in range(N)] for i in range(M)]
- start = time.perf_counter()
- f(lst)
- elapsed += time.perf_counter() - start
- print(f"{f.__name__} cost {elapsed/n * 1000 :.4f} ms")
- if __name__ == '__main__':
- time_f(flatten1)
- time_f(flatten2)
- time_f(flatten3)
- time_f(flatten4)
- time_f(flatten5)
- time_f(flatten6)
運(yùn)行環(huán)境:Python 3.8.5,運(yùn)行結(jié)果如下:
結(jié)果:前兩種方法比較慢,不推薦使用,后面四種方法差別不大,隨你挑。