AI毛毛的blog

Python3中不同方式建立已知长度数组的效率

今天在做一个前缀和题目的时候,因为要预分配一个前缀和数组,而数组的长度是已知的,所以想到了对比一下几种数组生成方式的效率。

这里用生成10000个int型数据的数组来做对比。

1. 列表生成式

1
[i for i in range(10000)]

list_001.png

可以看到平均速率是258µs。

2. list的append方法

1
2
3
4
5
def test_listappend(n):
res = []
for i in range(n):
res.append(i)
return res

list_002.png

可以看到平均速率是701µs,相对列表生成式来说慢了很多。

3. list的预分配方法

1
2
3
4
5
def test_preadd(n):
res = [0] * n
for i in range(n):
res[i] = i
return res

list_003.png

预分配空间后,再将值写入,效率大概在445µs左右,比append方法快,但是依然比列表生成式慢。

4. deque的append方法

1
2
3
4
5
6
7
from collections import deque

def test_dequeappend(n):
res = deque()
for i in range(n):
res.append(i)
return res

list_004.png

速率大概是680µs,只比list的append方法快了一点点。

5. deque的预分配方法

1
2
3
4
5
6
7
from collections import deque

def test_predeque(n):
res = deque([0] * n)
for i in range(n):
res[i] = i
return res

list_005.png

777µs,比deque的append的效率还要慢一些。

可以看出,在数组长度已知的情况下,列表生成式的效率是很高的,如果不使用列表生成式,预分配数组空间再遍历写入值,效率也是比append方法要来的快。