我将改进我的代码片段的性能,该代码片段将经常以递归方式获取子数组。为什么Numpy.array比获取子列表的内建列表慢
所以我用numpy.array代替了内建列表。因为,据我所知,在获取子数组时,numpy.array不会复制原始列表。
但是当我改成numpy.array时,性能变差了。所以我想知道原因。谢谢!
以下是我的代码片段,通过使用不同的对象,我得到了执行时间:
import timeit
stat = '''
import numpy
def func(a):
a[len(a)-1] += 1
if len(a) == 1:
return a[0]
else:
return func(a[1:len(a)])
a1=[1,2,3,4,5,6,7,8,9,10]
a2=numpy.array([1,2,3,4,5,6,7,8,9,10])
'''
if __name__ == "__main__":
print "Execution time with build-in list: {0}".format(timeit.timeit('func(a1)', setup = stat, number = 1000))
print "Execution time with Numpy array: {0}".format(timeit.timeit('func(a2)', setup = stat, number = 1000))
而且在我的64位MAC(Python的2.7.6 + NumPy的1.8.0rc1)输出:
Execution time with build-in list: 0.00507998466492
Execution time with Numpy array: 0.0195469856262
它可能不会复制原始列表,但您仍然需要创建一个新的numpy数组,其中包含原始引用,这显然比创建新列表更加昂贵。你可以尝试用一个*很大的列表/数组来测试它。 – chepner
以chepner为基础,随着数组大小的增加,时间如何变化?如果他的假设是正确的,那么列表运行时不会发生显着变化,但数组运行时会线性增加。 – WakkaDojo
@chepner看来你是对的。我测试和numpy阵列比内置列表大阵列更快。但是你能解释为什么创建一个新的numpy数组引用比创建一个新列表显然更昂贵吗? – AngelIW