转载需注明出处:https://www.codelast.com/

在Python中,假设你最终想得到一个NumPy array,而它是通过append大量数据得到的,那么有两种办法:
先创建一个Python list,append完数据之后再把这个list转成NumPy array。
 直接创建一个NumPy array,用 np.append() 函数来append数据。
第1种比第2种快很多,尤其是当你在一个for循环中频繁做这个事情的时候,差距就更明显了。

用下面的代码来实验:

import random
import time
r1 = random.sample(range(1, 100), 10)
r2 = random.sample(range(1, 100), 20)
r3 = random.sample(range(1, 100), 30)
r4 = random.sample(range(1, 100), 40)
start_time = time.time()
for _ in range(100000):
a = []
a.append(3.5)
a.append(5.1)
a.append(0.2)
a.append(4.6)
a.append(20.3)
a.append(2.5)
a.extend(r1)
a.extend(r2)
a.extend(r3)
a.extend(r4)
b = np.asarray(a, dtype=np.float32)
print(f'list.append() used: {time.time() - start_time} seconds')
start_time = time.time()
for _ in range(100000):
a = np.array([], dtype=np.float32)
a = np.append(a, 3.5)
a = np.append(a, 5.1)
a = np.append(a, 0.2)
a = np.append(a, 4.6)
a = np.append(a, 20.3)
a = np.append(a, 2.5)
a = np.append(a, r1)
a = np.append(a, r2)
a = np.append(a, r3)
a = np.append(a, r4)
print(f'np.append() used: {time.time() - start_time} seconds')

文章来源:https://www.codelast.com/
结果:

list.append() used: 0.872962236404419 seconds
np.append() used: 5.864704847335815 seconds
可见第1种方法速度快太多了。而且append的数据越多,差距可能就越明显。
为什么会这样?不妨看看 np.append() 的文档:

Returns
-------
append : ndarray
    A copy of `arr` with `values` appended to `axis`.  Note that
    `append` does not occur in-place: a new array is allocated and
    filled.

也就是说 np.append() 不是 in-place 的append,它会分配一块新的内存,再把数据copy到里面去。
为了计算高效,一个NumPy array在底层是存储在一块连续的内存区域里,所以在频繁进行 np.append() 的时候,会导致大量的 分配新内存→拷贝数据 的操作,从而严重拖慢运行速度。
相比之下,Python的list则对应的可能是不连续的内存区域,append起来速度就快得多。在list.append完成之后再转成NumPy array,只会发生一次 分配新内存→拷贝数据 的操作,速度自然就快得多了。

[原创] Python的list.append()比np.append()更快
Tagged on:     

发表评论

电子邮件地址不会被公开。 必填项已用*标注