如何在 Python 中创建具有特定大小的列表

Jinku Hu 2023年1月30日
  1. 为列表预分配存储
  2. 为其他顺序数据结构预分配存储
如何在 Python 中创建具有特定大小的列表

当程序员提前知道元素数量时,为列表或数组预分配存储空间是程序员经常用地方式。

C++ 和 Java 不同,在 Python 中,你必须使用一些值初始化所有预分配的存储。通常情况下,开发人员使用假值用于此目的,如 None''False0

Python 提供了几种创建固定大小列表的方法,每种方法都有不同的性能特征。

为了比较不同方法的性能,我们将使用 Python 的标准模块 timeit。它提供了一种方便的方法来测量一小段 Python 代码的运行时间。

为列表预分配存储

第一个也是最快的方法,就是使用*运算符,它将列表重复指定的次数。

>>> [None] * 10
[None, None, None, None, None, None, None, None, None, None]

一百万次迭代(timeit 的默认迭代值)大约需要 117 毫秒。

>>> timeit("[None] * 10")
0.11655918900214601

另一种方法是将 range 内置函数与列表推导式一起使用。

>>> [None for _ in range(10)]
[None, None, None, None, None, None, None, None, None, None]

它慢了将近六倍,每百万次迭代需要 612 毫秒的时间。

>>> timeit("[None for _ in range(10)]")
0.6115895550028654

第三种方法是 list.append()for 循环一起使用。

>>> a = []
>>> for _ in range(10):
...   a.append(None)
...
>>> a
[None, None, None, None, None, None, None, None, None, None]

使用循环是最慢的方法,需要 842 毫秒才能完成一百万次迭代。

>>> timeit("for _ in range(10): a.append(None)", setup="a=[]")
0.8420009529945673

为其他顺序数据结构预分配存储

由于你要为顺序数据结构预先分配存储空间,因此使用 array 内置数据结构而不是列表可能更有意义。

>>> from array import array
>>> array('i',(0,)*10)
array('i', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

如下所示,此方法仅次于 [None] * 10

>>> timeit("array('i',(0,)*10)", setup="from array import array")
0.4557597979946877

让我们将上述纯 Python 方法与 NumPy 用于科学计算的 Python 库进行比较。

>>> from numpy import empty
>>> empty(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

NumPy 方法每百万次迭代需要 589 毫秒。

>>> timeit("empty(10)", setup="from numpy import empty")
0.5890094790011062

但是,对于更大量的列表,NumPy 方法将更快。

>>> timeit("[None]*10000")
16.059584009999526
>>> timeit("empty(10000)", setup="from numpy import empty")
1.1065983309963485

结论是,对于小地列表来说,最好使用 [None] * 10,但在处理更大量的顺序数据时切换到 NumPy 的 empty()

作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - Python List