我想加快我的代碼的一部分,涉及循環和設置一個大的二維數組中的值。其中一個建議是,我嘗試預先分配數組而不是使用.append(),但它指出在Python中,.append()是一個攤銷O(1)操作。爲什麼.append()比在預分配數組中設置值慢?
然而,當我測試使用以下代碼:
import time
x = list()
z = list()
t1 = time.time()
for i in range(10000):
z.append([])
for j in range(10000):
z[i].append(0)
t1 = time.time()
for i in range(10000):
x.append([])
for j in range(10000):
x[i].append(1)
print(time.time()-t1)
t1 = time.time()
for i in range(10000):
for j in range(10000):
z[i][j] = 1
print(time.time()-t1)
我consitently得到相比〜21預先分配的陣列以3-4秒小於未預分配的陣列(〜17S )。這段代碼中的基於.append()的函數花費的時間比替換預分配數組中的值要長嗎?
「攤銷O(1)」表示當你考慮對象的整個生命週期時,它是O(1),而不僅僅是任何追加本身,這就是你在這裏做的。就像任何毫無意義的基準一樣,除非你對整個項目進行簡介並證明它很重要,否則這並不重要。 –
我對Python沒有多少了解,但是對於大多數編程語言來說,追加到一個數組(在內存中必須是連續的)通常意味着必須騰出空間來擴展數組,這樣每次追加都需要額外的時間。 –
@NicFoster:動態數組的容量很少被擴展爲1,它更可能是當前容量的一半或兩倍或類似的東西(這是分攤的東西來自哪裏)。 –