NumPy数组在数值运算方面的效率优于Python提供的list容器。使用NumPy可以在代码中省去很多循环语句,因此其代码比等价的Python代码更为简洁。
实践:向量加法
假设我们需要对两个向量a和b做加法。
以下的纯Python代码可以解决上述问题:
def pythonsum(n): a = range(n) b = range(n) c = [] for i in range(len(a)): a[i] = i ** 2 b[i] = i ** 3 c.append(a[i] + b[i]) return c
以下是使用NumPy的代码,它同样能够解决问题:
def numpysum(n):
a = np.arange(n) ** 2
b = np.arange(n) ** 3
c = a + b
return c
numpysum()函数中没有使用for循环。同时,我们使用NumPy中的arange函数来创建包含0~n的整数的NumPy数组。代码中的arange函数前面有一个前缀numpy,表明该函数是从NumPy模块导入的。
让我们来看看纯Python代码和NumPy代码是否得到相同的结果:
import sys
from datetime import datetime
import numpy as np
#省略上面两处代码
size = int(sys.argv[1])
start = datetime.now()
c = pythonsum(size)
delta = datetime.now() - start
print "The last 2 elements of the sum", c[-2:]
print "PythonSum elapsed time in microseconds", delta.microseconds
start = datetime.now()
c = numpysum(size)
delta = datetime.now() - start
print "The last 2 elements of the sum", c[-2:]
print "NumPySum elapsed time in microseconds", delta.microseconds
显然,NumPy代码比等价的纯Python代码运行速度快得多。有一点可以肯定,即不论我们使用NumPy还是Python,得到的结果是一致的。不过,两者的输出结果在形式上有些差异。注意,numpysum()函数的输出不包含逗号。这是为什么呢?显然,我们使用的是NumPy数组,而非Python自身的list容器。