最近一直在折腾Numpy的路上越走越远,发现有很多东西可以深入研究。今天就来简单介绍一下NumPy 和 Python中append()函数的特点,以及append()的特性是否适合用于大数据的处理。
NumPy 和 Python中append()函数的特点
首先我们来复习一下Python中的append()用法,作为Python中最为常见的插入方法之一,相信大家都不会陌生,肯定在初学时对于这个基础语法有所了解。下面的例子可以让大家有一个回顾:
>>> a = []
>>> a.append([1,2,3])
>>> a.append([1,2,3])
>>> a
[[1, 2, 3], [1, 2, 3]]
那么NumPy是否也可以实现同样的功能呢?答案应该是肯定的。这个功能应该也是任何数学包都会包含的。具体如下:
>>> b = np.empty([0,3], dtype=int)
>>> b_1 = np.append(b,[[1,2,3]], axis=0)
>>> b_2 = np.append(b_1,[[1,2,3]], axis=0)
>>> b_1
[[1 2 3]]
>>> b_2
[[1 2 3]
[1 2 3]]
NumPy append()性能优化
对于NumPy中append()方法的性能,其实是饱受诟病的,特别是在处理一些数据量比较大的问题时,耗时是个令人头疼的问题。接下来就拿循环append来做个实验好了。
针对这种问题,其实我个人并不推荐使用这种方法。相对来说,先插入列表中,之后再将其转换为一个NumPy的数组会更快速一些。
方法一:插入列表,转换为数组
%%timeit
list_a = []
for i in range(10000):
list_a.append([1,2,3])
list_a = np.asarray(list_a)
#100 loops, best of 3: 5.51 ms per loop
方法二:创建数组,依次插入
%%timeit
list_b = np.empty([0,3], dtype=int)
for i in range(10000):
list_b = np.append(list_b,[1,2,3])
#10 loops, best of 3: 81.4 ms per loop
经过两次实验,我们可以发现前后两次之间耗时差距还是很悬殊的。倘若处理更加复杂的数据,那么时间和算力上的浪费就会显得更加严重。综上,下一个比较武断的结论:在插入数据,特别是数据量很大的时候,NumPy的append方法并没有明显的优势,推荐使用方法一。另外,NumPy的concatenate()也是一个不错的选择,有兴趣的读者也可以尝试一下。