假设您想编写一个函数,生成一个对象列表,并且您预先知道该列表的长度为n.

在python中,列表支持O(1)中的索引访问,因此可以认为,预先分配列表并使用索引访问它,而不是分配空列表并使用append()方法是一个好主意.这是因为如果空间不够,我们可以避免扩展整个列表的负担.

如果我使用的是python,那么性能在任何情况下都可能没有那么重要,但是预分配列表的更好方法是什么呢?

我知道这些可能的候选人:

  • [None] * n→ 分配两个列表
  • [None for x in range(n)]-或Python 中的xrange→ 建造另一个物体

一个明显比另一个好吗?

如果我们是n = len(input)人呢?既然input已经存在,那么[None for x in input]会有更好的表现吗?

推荐答案

在这两个选项之间,第一个显然更好,因为不涉及Python for循环.

>>> %timeit [None] * 100
1000000 loops, best of 3: 469 ns per loop
>>> %timeit [None for x in range(100)] 
100000 loops, best of 3: 4.8 us per loop

Update:

list.append也有一个O(1) complexity,如果你把list.append方法分配给一个变量,它可能比预先创建列表更好.

>>> n = 10**3
>>> %%timeit
lis = [None]*n           
for _ in range(n):
    lis[_] = _
... 
10000 loops, best of 3: 73.2 us per loop
>>> %%timeit
lis = []                 
for _ in range(n):
    lis.append(_)
... 
10000 loops, best of 3: 92.2 us per loop
>>> %%timeit
lis = [];app = lis.append
for _ in range(n):
    app(_)
... 
10000 loops, best of 3: 59.4 us per loop

>>> n = 10**6
>>> %%timeit
lis = [None]*n
for _ in range(n):
    lis[_] = _
... 
10 loops, best of 3: 106 ms per loop
>>> %%timeit
lis = []      
for _ in range(n):
    lis.append(_)
... 
10 loops, best of 3: 122 ms per loop
>>> %%timeit
lis = [];app = lis.append
for _ in range(n):
    app(_)
... 
10 loops, best of 3: 91.8 ms per loop

Python-3.x相关问答推荐

动态范围内来自另外两列的列求和

如何在 python 中将带有时区信息的时间戳转换为 utc 时间

在python内的powershell中转义$_

当我在正则表达式末尾使用斜杠时,为什么会得到不同的结果?

我正在使用 python 线程,当查询 mysql 时,代码似乎在运行并保持在无限循环中,没有返回任何错误

将逗号分隔的字符串类型系列转换为整数列表 pandas

为什么 numpy 的 `np.char.encode` 会将一个空的 unicode 数组变成一个空的 `float64` 数组?

如何在数据['column']中的'string'等条件下应用pandas

用于 BIG 数组计算的多处理池映射比预期的要慢

FastAPI - 调用 API 时设置 response_model_exclude

pip install mysqlclient 失败为 mysqlclient 运行 setup.py bdist_wheel ... 错误

解包时是否可以指定默认值?

将字节数组转换为类似字节的对象?

使用 distutils 分发预编译的 python 扩展模块

如何在 python 3.x 中禁用 ssl 判断?

为 Python 3 和 PyQt 构建可执行文件

计数大于Pandas groupby 中的值的项目

警告:请使用 tensorflow/models 中的官方/mnist/dataset.py 等替代方案

TypeError:只有整数标量数组可以转换为标量索引

在 PostgreSQL 上使用 SQLAlchemy 创建全文搜索索引