Python处理大型数组的计算——百倍性能加速

对于任何设计数组的计算密集型任务,请使用NumPy库。

NumPy库的主要特性是为Python提供了数组对象,比标准Python的列表有着更好的性能表现,更加适合用做数学计算。

先展示一下对于基本的运算符,标准列表和NumPy的数组的差异如何

1>标准列表

>>> #Python lists
>>> x = [1, 2, 3, 4]
>>> y = [5, 6, 7, 8]
>>> x * 2
[1, 2, 3, 4, 1, 2, 3, 4]
>>> x + 10
Traceback (most recent call last):
  File "", line 1, in 
    x + 10
TypeError: can only concatenate list (not "int") to list
>>> x + y
[1, 2, 3, 4, 5, 6, 7, 8]

2>NumPy的数组

>>> #NumPy arrays
>>> import numpy as np
>>> ax = np.array([1, 2, 3, 4])
>>> ay = np.array([5, 6, 7, 8])
>>> ax * 2
array([2, 4, 6, 8])
>>> ax + 10
array([11, 12, 13, 14])
>>> ax + ay
array([ 6,  8, 10, 12])
>>> ax * ay
array([ 5, 12, 21, 32])

可以看到,有关数组的几个基本数学运算在行为上都有所不同。特别是NumPy中的数组在进行标量计算的时候(比如ax * x或 ax + 10)是针对逐个元素进行计算的。此外,当两个操作数都是数组时,NumPy数组在进行数学计算的时候会针对数组的所有元素进行计算并产生一个新的数组作为结果。

由于数学计算会被同时施加于所有元素上,所以这一事实让整个数组的计算变得非常简单和快速。

>>> def f(x):
	return 3*x**x - 2*x +7
>>> f(ax)
array([  8,  15,  82, 767])

对于大量的计算密集型任务,NumPy的数组计算比使用列表推导式快上不少,在百万个元素的情况下,标准列表的推导式耗费了6秒,而NumPy的数组仅仅需要0.19秒!PAT也支持导入NumPy,但是导入它需要花费一百五十毫秒左右的时间,需要不需要,就看取舍了。

NumPy也提供了一些通用函数,比如开方,求余弦值等,这些通用函数的效率比对数组进行迭代然后使用math模块中的函数每次只处理一个元素要快上百倍。

在底层,NumPy的数组的内存分配方式和C或者Fortan一样,都是一大块的连续内存,且由同一类型数据组成。正是因为如此,NumPy才能创建比通常Python中的列表大得多的数组:比如想创建一个10000 * 10000 的二维浮点数组,根本不是问题。

除此之外,NumPy还拓展了Python列表的索引功能,尤其是针对多维数组

>>> import numpy as np
>>> a = np.array([
	[1, 2, 3, 4],
	[5, 6, 7, 8],
	[9, 10, 11, 12],
	[13, 14, 15, 16]
	])
>>> a
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])
>>> a = np.array([[ 1,  2,  3,  4],
	       [ 5,  6,  7,  8],
	       [ 9, 10, 11, 12],
	       [13, 14, 15, 16]])
>>> #获取第一行
>>> a[1]
array([5, 6, 7, 8])
>>> #获取第一列
>>> a[:,1]
array([ 2,  6, 10, 14])
>>> #获取数组中的一部分
>>> a[1:3, 1:3]
array([[ 6,  7],
       [10, 11]])
>>> #对数组中的一部分进行操作
>>> a[1:3, 1:3] += 10
>>> a
array([[ 1,  2,  3,  4],
       [ 5, 16, 17,  8],
       [ 9, 20, 21, 12],
       [13, 14, 15, 16]])

更多技术干货,有趣文章,点这里没错

你可能感兴趣的:(Python)