扁平化列表,哪個方法更快?
作者: somenzz
在平時的編碼過程中,經常會碰到嵌套列表扁平化的需求,比如說把列表[[1,2,3],[4,5]] 變成 [1,2,3,4,5],Python 有很多方法可以實現這一功能,到底哪個方法更快呢?
在平時的編碼過程中,經常會碰到嵌套列表扁平化的需求,比如說把列表[[1,2,3],[4,5]] 變成 [1,2,3,4,5],Python 有很多方法可以實現這一功能,到底哪個方法更快呢?我們今天就來試一試。
第一種方法:建一個空列表,遍歷嵌套列表把元素逐一放入并返回:
- 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]
第三種方法:使用列表的 extend 方法:
- 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
第五種方法:使用 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, [])
你可以先猜一下,然后看看下面的運行結果:
- 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)
運行環境:Python 3.8.5,運行結果如下:
結果:前兩種方法比較慢,不推薦使用,后面四種方法差別不大,隨你挑。
責任編輯:武曉燕
來源:
Python七號