我將改進我的代碼片段的性能,該代碼片段將經常以遞歸方式獲取子數組。爲什麼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