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

在平时的编码过程中,经常会碰到嵌套列表扁平化的需求,比如说把列表[[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,运行结果如下:

531e4dad530d0c0b5808c173e499971c.png

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

最后的话

编程最重要的就是动手,当你出现选择困难时,不妨写几个简单的函数,跑起来测试一下,你心里就有答案了。

如果非要弄个明白的话,可以看看相关函数或标准库的源代码,不过这可能要花费更多的时间。

如果有收获,请点赞支持,感谢阅读。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WinForms 扁平化模板是一种用于设计器环境中的可视化元素,用于创建现代和简洁的用户界面。下载 WinForms 扁平化模板可以提供一些预定义的界面元素和样式,使我们可以更快速、高效地构建出精美的界面。 WinForms 是一种用于 Windows 桌面应用程序开发的技术框架,扁平化模板可以帮助开发人员在设计界面时提供一些基础的样式和布局,减少手动编写代码的工作量。将这些模板应用到项目中可以使界面看起来更加现代和美观。 下载 WinForms 扁平化模板的步骤如下: 1. 在网络上搜索 WinForms 扁平化模板。 2. 找到适合自己需要的模板并进行下载,通常这些模板会以压缩文件的形式提供。 3. 解压缩下载的文件,将其中的模板文件复制到自己的项目目录中。 使用 WinForms 扁平化模板的好处: 1. 提高开发效率:扁平化模板提供了一些预设的界面元素和样式,可以减少手动编写代码的工作量,快速搭建出精美的用户界面。 2. 美观的用户界面:扁平化设计风格在现代应用程序中非常流行,使用这些模板可以使界面看起来更加现代、简洁、美观。 3. 可定制性:模板只是提供了一些基础的样式和布局,开发人员可以根据自己的需求进行进一步的修改和定制,使界面更符合项目的要求。 总的来说,通过下载 WinForms 扁平化模板,开发人员可以快速搭建出现代精美的用户界面,提高开发效率和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值