在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 secondsnp.append() used: 5.864704847335815 seconds
可见第1种方法速度快太多了。而且append的数据越多,差距可能就越明显。
为什么会这样?不妨看看 np.append() 的文档:
为什么会这样?不妨看看 np.append() 的文档:
Returns-------append : ndarrayA copy of `arr` with `values` appended to `axis`. Note that`append` does not occur in-place: a new array is allocated andfilled.
也就是说 np.append() 不是 in-place 的append,它会分配一块新的内存,再把数据copy到里面去。
为了计算高效,一个NumPy array在底层是存储在一块连续的内存区域里,所以在频繁进行 np.append() 的时候,会导致大量的 分配新内存→拷贝数据 的操作,从而严重拖慢运行速度。
相比之下,Python的list则对应的可能是不连续的内存区域,append起来速度就快得多。在list.append完成之后再转成NumPy array,只会发生一次 分配新内存→拷贝数据 的操作,速度自然就快得多了。
文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤
转载需注明出处:codelast.com
感谢关注我的微信公众号(微信扫一扫):