RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1582185
Accepted
hedgehogues
hedgehogues
Asked:2024-05-30 20:54:43 +0000 UTC2024-05-30 20:54:43 +0000 UTC 2024-05-30 20:54:43 +0000 UTC

从列表列表中创建扁平列表的最有效方法是什么?

  • 772

找到最快速有效的方法来将列表转换为扁平化同时保持顺序是很有趣的:

[
    [5, 6],
    [7, 8, 9],
    [10, 11, 12, 13, 14],
    [15, 16, 17, 18]
]

结果[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]?

python
  • 1 1 个回答
  • 65 Views

1 个回答

  • Voted
  1. Best Answer
    CrazyElf
    2024-05-30T23:06:33Z2024-05-30T23:06:33Z

    你为什么不喜欢简单的列表相加?我也尝试过Numpy翻译,但事实证明,将普通列表转换为数组Numpy就耗尽了Numpy快速使用其本机数据类型所带来的所有可能的好处。现在,如果您已经拥有数组格式的数据Numpy,那么使用内置方法是有意义的Numpy,并且它比纯 Python 更快。

    %%time
    lst = [
        [5, 6] * 1_000,
        [7, 8, 9] * 1_000,
        [10, 11, 12, 13, 14] * 1_000,
        [15, 16, 17, 18] * 1_000
    ] * 1_000
    
    result = []
    for item in lst:
        result += item
    print(len(result))
    

    结论:

    14000000
    CPU times: total: 344 ms
    Wall time: 360 ms
    

    0.3 秒内组装 1400 万个元件。

    PS是的,当向列表添加元素时,为列表准备的数组会定期调整大小,但它是有一个边距(之前大小的 2 倍,或者对于已经非常大的列表可能是 1.5 倍)完成的 - 我不太记得了Python 中的实现细节,我可能会与 中的列表混淆C#,如果我们采用 2,那么这只是初始列表大小 16 到 1400 万的大约 20 次调整大小)。因此,复制整个列表而耗时的调整大小并不经常发生,并且简单地将元素放置在列表的下一个空闲单元中是很便宜的,Python 对于典型的集合操作进行了相当优化。

    PPS根据观众的要求,我在保持元素总数的同时计算了对数组大小和数量的依赖性。

    import time
    
    n = 100_000_000
    print(f'Всего {n:,} элементов')
    for i in range(7, 0, -1):
        k = 10**i
        m = n // k
        lst = [[42] * k] * m
        t = time.time()
        result = []
        for item in lst:
            result += item
        print(f'Конкатенация {m:,} списков по {k:,} элементов: {time.time() - t:.2f}с')
    

    结论:

    Всего 100,000,000 элементов
    Конкатенация 10 списков по 10,000,000 элементов: 1.80с
    Конкатенация 100 списков по 1,000,000 элементов: 2.72с
    Конкатенация 1,000 списков по 100,000 элементов: 2.98с
    Конкатенация 10,000 списков по 10,000 элементов: 3.21с
    Конкатенация 100,000 списков по 1,000 элементов: 3.04с
    Конкатенация 1,000,000 списков по 100 элементов: 3.26с
    Конкатенация 10,000,000 списков по 10 элементов: 3.88с
    

    从这个测试中可以看出,列表更少 -> 调整大小更少 -> 在元素总数相同的情况下,连接列表的过程花费的时间更少。

    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5