扁平化列表,哪个方法更快?

开发 前端
在平时的编码过程中,经常会碰到嵌套列表扁平化的需求,比如说把列表[[1,2,3],[4,5]] 变成 [1,2,3,4,5],Python 有很多方法可以实现这一功能,到底哪个方法更快呢?

[[433688]]

在平时的编码过程中,经常会碰到嵌套列表扁平化的需求,比如说把列表[[1,2,3],[4,5]] 变成 [1,2,3,4,5],Python 有很多方法可以实现这一功能,到底哪个方法更快呢?我们今天就来试一试。

第一种方法:建一个空列表,遍历嵌套列表把元素逐一放入并返回:

  1. def flatten1(lst: List[list]) -> list: 
  2.     flat = [] 
  3.     for l in lst: 
  4.         for x in l: 
  5.             flat.append(x) 
  6.     return flat 

第二种方法:使用列表推导式:

  1. def flatten2(lst: List[list]) -> list: 
  2.     return [x for l in lst for x in l] 

第三种方法:使用列表的 extend 方法:

  1. def flatten3(lst: List[list]) -> list: 
  2.     flat = [] 
  3.     for l in lst: 
  4.         flat.extend(l) 
  5.     return flat 

第四种方法:使用 + 号:

  1. def flatten4(lst: List[list]) -> list: 
  2.     flat = [] 
  3.     for l in lst: 
  4.         flat += l 
  5.     return flat 

第五种方法:使用 itertools.chain:

  1. def flatten5(lst: List[list]) -> list: 
  2.     return list(itertools.chain.from_iterable(lst)) 

第六种方法:使用 functools.reduce:

  1. def flatten6(lst: List[list]) -> list: 
  2.     return functools.reduce(operator.iconcat, lst, []) 

你可以先猜一下,然后看看下面的运行结果:

  1. import functools 
  2. import itertools 
  3. import operator 
  4. import random 
  5. import time 
  6. from typing import List 
  7.  
  8. def flatten1(lst: List[list]) -> list: 
  9.     flat = [] 
  10.     for l in lst: 
  11.         for x in l: 
  12.             flat.append(x) 
  13.     return flat 
  14.  
  15. def flatten2(lst: List[list]) -> list: 
  16.     return [x for l in lst for x in l] 
  17.  
  18. def flatten3(lst: List[list]) -> list: 
  19.     flat = [] 
  20.     for l in lst: 
  21.         flat.extend(l) 
  22.     return flat 
  23.  
  24. def flatten4(lst: List[list]) -> list: 
  25.     flat = [] 
  26.     for l in lst: 
  27.         flat += l 
  28.     return flat 
  29.  
  30. def flatten5(lst: List[list]) -> list: 
  31.     return list(itertools.chain.from_iterable(lst)) 
  32.  
  33. def flatten6(lst: List[list]) -> list: 
  34.     return functools.reduce(operator.iconcat, lst, []) 
  35.                             # += 
  36.  
  37. def time_f(f): 
  38.     elapsed = 0.0 
  39.     n = 100 
  40.     M = 1000 
  41.     N = 100 
  42.     for _ in range(n): 
  43.         lst = [[random.randint(0,1000000) for j in range(N)] for i in range(M)] 
  44.         start = time.perf_counter() 
  45.         f(lst) 
  46.         elapsed += time.perf_counter() - start 
  47.     print(f"{f.__name__} cost {elapsed/n * 1000 :.4f} ms"
  48.  
  49. if __name__ == '__main__'
  50.     time_f(flatten1) 
  51.     time_f(flatten2) 
  52.     time_f(flatten3) 
  53.     time_f(flatten4) 
  54.     time_f(flatten5) 
  55.     time_f(flatten6) 

运行环境:Python 3.8.5,运行结果如下:

 

结果:前两种方法比较慢,不推荐使用,后面四种方法差别不大,随你挑。

 

责任编辑:武晓燕 来源: Python七号
相关推荐

2013-09-22 15:03:27

扁平化UI设计

2013-09-22 15:43:27

扁平化UI设计

2013-09-22 14:47:50

扁平化UI设计

2013-09-22 14:56:26

扁平化UI设计

2013-09-22 14:30:43

扁平化设计

2013-09-22 16:36:07

扁平化UI设计

2013-09-22 16:17:59

扁平化UI设计

2013-09-22 16:22:58

扁平化UI设计

2013-07-11 09:45:48

扁平化扁平化设计

2013-09-23 10:16:04

扁平化UI设计

2019-04-08 16:29:28

多云扁平化云计算

2013-06-09 11:04:07

设计扁平化设计平面化设计

2013-09-25 10:52:27

Android 4.4扁平化

2013-09-22 16:30:13

扁平化UI设计

2013-01-28 09:39:05

用户界面扁平化设计

2020-09-16 14:17:42

flat方法

2013-09-22 15:09:04

扁平化UI设计

2010-10-25 14:16:59

扁平化网络

2012-02-20 14:48:30

网络扁平化

2010-10-25 13:58:48

点赞
收藏

51CTO技术栈公众号