array.array或numpy.array相对于典型数组是否提供了显著的性能提升?
我尝试使用以下代码进行测试:
import timeit, math, array
from functools import partial
import numpy as np
def calc1(x):
for i in range(1,len(x)):
x[i] = x[i-1] + 1
def calc2(x):
for i in range(0,len(x)):
x[i] = math.sin(i)
L = int(1e5)
print('np 1: {:.5f} s'.format(timeit.timeit(partial(calc1, np.array([0] * L)), number=20)))
print('np 2: {:.5f} s'.format(timeit.timeit(partial(calc2, np.array([0] * L)), number=20)))
vfunc = np.vectorize(math.sin)
print('np 2 vectorized: {:.5f} s'.format(timeit.timeit(partial(vfunc, np.arange(0, L)), number=20)))
print('list 1: {:.5f} s'.format(timeit.timeit(partial(calc1, [0] * L), number=20)))
print('list 2: {:.5f} s'.format(timeit.timeit(partial(calc2, [0] * L), number=20)))
print('array 1: {:.5f} s'.format(timeit.timeit(partial(calc1, array.array("f", [0] * L)), number=20)))
print('array 2: {:.5f} s'.format(timeit.timeit(partial(calc2, array.array("f", [0] * L)), number=20)))
结果表明在这里list执行速度最快(Python 3.3,NumPy 1.8):
np 1: 2.14277 s
np 2: 0.77008 s
np 2 vectorized: 0.44117 s
list 1: 0.29795 s
list 2: 0.66529 s
array 1: 0.66134 s
array 2: 0.88299 s
这似乎是违反直觉的。对于这些简单的示例,使用numpy
或array
似乎没有任何优势。